home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / Software / TemaCD / tcvpa / data1.cab / MyFileGroup / INCLUDE / BCD.hpp < prev    next >
C/C++ Source or Header  |  1999-06-03  |  11KB  |  359 lines

  1. #ifndef _INC_BCD_HPP
  2. #define _INC_BCD_HPP
  3. class TC_CBCD;
  4. enum BcdRet {
  5.  bcd_Ok,
  6.  bcd_Fmt,
  7.  bcd_TooLarge,
  8. };
  9. #define    BCDFMT_CRNCY        0x00000001L        // %$    use currency format
  10. #define    BCDFMT_CRNCY_NAME    0x00000002L        // %C    currency name; +string
  11. #define    BCDFMT_CRNCY_POS    0x00000004L        // %P    currency name position; +number:  0 left, 1 right, 2 at decimal pos
  12. #define    BCDFMT_CRNCY_SPACES    0x00000008L        // %S    currency space separators; +number
  13. #define    BCDFMT_SIGN            0x00000010L        // %+    include sign
  14. #define    BCDFMT_THOUSANDS    0x00000020L        // %,    separate thousands
  15. #define    BCDFMT_PARENTH_NEG    0x00000040L        // %(    negative in parenteses
  16. #define    BCDFMT_DEC_SEP        0x00000080L        // %D    decimal separator;  +string
  17. #define    BCDFMT_RIGHT_JUST    0x00000100L        // %J    right justify
  18. #define    BCDFMT_FRACTZ_TRIM    0x00000200L        // %f    truncate fraction zeroes
  19. #define    BCDFMT_THOUSAND_SEP    0x00000400L        // %T    thousands separator; +string
  20. #define    BCDFMT_DEC_NUM        0x00000800L        // %d    number of digits after decimal point (ignored in case of BCD )
  21.  extern  TC_COREEX_EXPORT TC_CBCD tcNullBCD ;
  22.  
  23. // **********************************************************************
  24. class TC_COREEX_EXPORT TC_CBCD 
  25. {
  26. #define ABS_VAL(v) (v < 0 ? -v : v)
  27. #define SIZE_OF_BODY(P,S) ((ABS_VAL(S) >= P ? ABS_VAL(S) : P)/2)
  28.  
  29. #define FBCD_NULL    0
  30. #define FBCD_VAL    1
  31. #define    FBCD_OVF    2
  32. private: 
  33. enum  {
  34.  op_Add,
  35.  op_Sub,
  36. };
  37. public:
  38.     friend inline TC_CBCD operator + (TC_CBCD &a, TC_CBCD &b) { return TC_CBCD(a).Add(b, 0); }
  39.     friend inline TC_CBCD operator - (TC_CBCD &a, TC_CBCD &b) { return TC_CBCD(a).Add(b, 1); }    
  40.     friend inline TC_CBCD operator * (TC_CBCD &a, TC_CBCD &b) { return TC_CBCD(a).Mul(b); }
  41.     friend inline TC_CBCD operator / (TC_CBCD &a, TC_CBCD &b) { return TC_CBCD(a).Div(b); }
  42. private:  unsigned char m_P ;
  43. private:  signed char m_S ;
  44. private:  signed char m_Sign ;
  45. private:  char m_Flag ;
  46. private:  TC_CString m_Body ;
  47. private:  int m_Bytes ;
  48. public:   TC_CBCD (unsigned char P, signed char S) 
  49. {
  50. Init(P,S);
  51. } // end of func
  52. // **********************************************************************
  53.  
  54. public:   TC_CBCD (unsigned char P, signed char S, int val) 
  55. {
  56. Init(P,S);
  57. SetFromLong((long)val);
  58. } // end of func
  59. // **********************************************************************
  60.  
  61. public:   TC_CBCD (unsigned char P, signed char S, long val) 
  62. {
  63. Init(P,S);
  64. SetFromLong(val);
  65. } // end of func
  66. // **********************************************************************
  67.  
  68. public:   TC_CBCD (unsigned char P, signed char S, unsigned long val) 
  69. {
  70. Init(P,S);
  71. SetFromLong((long)val);
  72. } // end of func
  73. // **********************************************************************
  74.  
  75. public:   TC_CBCD (unsigned char P, signed char S, double val) 
  76. {
  77. Init(P,S);
  78. SetFromDouble(val);
  79. } // end of func
  80. // **********************************************************************
  81.  
  82. public:   TC_CBCD (unsigned char P, signed char S, const char * val) 
  83. {
  84. Init(P,S);
  85. SetValue(val);
  86. } // end of func
  87. // **********************************************************************
  88.  
  89. public:   TC_CBCD (unsigned char P, signed char S,TC_CBCD &val) 
  90. {
  91. Init(P,S);
  92. Assign(val);
  93. } // end of func
  94. // **********************************************************************
  95.  
  96. public:   TC_CBCD (TC_CBCD &bcd) 
  97. {
  98. Set(bcd);
  99. } // end of func
  100. // **********************************************************************
  101.  
  102. public:   TC_CBCD () 
  103. {
  104. Init(0,0);
  105. } // end of func
  106. // **********************************************************************
  107.  
  108. public:  void Init (unsigned char P, signed char S)  ;
  109. public:  void SetOverflow ()  ;
  110. public:  void SetNull ()  ;
  111. public:  int SetValue (const char* str, char * fmt = 0) 
  112. {
  113. return SetFromString(str, fmt, FALSE);
  114. } // end of func
  115. // **********************************************************************
  116.  
  117. public:  TC_CString Format (char * fmt = 0)  ;
  118. public:  void Format (TC_CString &s, char * fmt = 0)  ;
  119. public:  void Set (TC_CBCD & bcd)  ;
  120. public:  void Assign (TC_CBCD & bcd)  ;
  121. public:  int Compare (TC_CBCD & bcd) 
  122. {
  123. return CompareTo(bcd);
  124. } // end of func
  125. // **********************************************************************
  126.  
  127. public:  BOOL ToBuffer (unsigned char * dest, int dest_size)  ;
  128. public:  BOOL AssignBuffer (unsigned char * src, int src_size)  ;
  129. public:  BOOL SetFromBuffer (unsigned char * src)  ;
  130. public:  int SizeForBuffer () 
  131. {
  132. return 4 + Bytes();
  133. } // end of func
  134. // **********************************************************************
  135.  
  136. public: static int SizeForBuffer (unsigned char P, signed char S)  ;
  137. public:  BOOL IsNull ()  ;
  138. public:  BOOL IsOverflow ()  ;
  139. public:  BOOL IsSameType (TC_CBCD & bcd)  ;
  140. public:  int Prec () 
  141. {
  142. return m_P;
  143. } // end of func
  144. // **********************************************************************
  145.  
  146. public:  int Scale () 
  147. {
  148. return m_S;
  149. } // end of func
  150. // **********************************************************************
  151.  
  152. public:  BOOL IsZero ( void )  ;
  153. public:  int Sign () 
  154. {
  155. return m_Sign;
  156. } // end of func
  157. // **********************************************************************
  158.  
  159. public:  void Winout (char * t = 0)  ;
  160. public:  int IsStringValid (const char* str, char * fmt = 0) 
  161. {
  162. return SetFromString(str, fmt, TRUE);
  163. } // end of func
  164. // **********************************************************************
  165.  
  166. public:  BOOL IsFmtValid (const char * fmt)  ;
  167. public:  int Bytes ()  ;
  168. public:  int AsInt () 
  169. {
  170. return (int)AsLong();
  171. } // end of func
  172. // **********************************************************************
  173.  
  174. public:  long AsLong ()  ;
  175. public:  double AsDouble ()  ;
  176. private:  TC_CBCD& Add (TC_CBCD& bcd, int op)  ;
  177. private:  TC_CBCD & Mul (TC_CBCD & bcd)  ;
  178. private:  TC_CBCD & Div (TC_CBCD & bcd)  ;
  179. private:  TC_CBCD & Neg ()  ;
  180. public:  int operator > (TC_CBCD & bcd) 
  181. {
  182. return CompareTo(bcd)==cmp_Greater;
  183. } // end of func
  184. // **********************************************************************
  185.  
  186. public:  int operator < (TC_CBCD & bcd) 
  187. {
  188. return CompareTo(bcd)==cmp_Less;
  189. } // end of func
  190. // **********************************************************************
  191.  
  192. public:  int operator == (TC_CBCD & bcd) 
  193. {
  194. return CompareTo(bcd)==cmp_Equal;
  195. } // end of func
  196. // **********************************************************************
  197.  
  198. public:  int operator >= (TC_CBCD & bcd) 
  199. {
  200. int cmp = CompareTo(bcd);
  201. return (cmp==cmp_Greater || cmp==cmp_Equal);
  202. } // end of func
  203. // **********************************************************************
  204.  
  205. public:  int operator <= (TC_CBCD & bcd) 
  206. {
  207. int cmp = CompareTo(bcd);
  208. return (cmp==cmp_Less || cmp==cmp_Equal);
  209. } // end of func
  210. // **********************************************************************
  211.  
  212. public:  int operator != (TC_CBCD & bcd) 
  213. {
  214. return CompareTo(bcd)!=cmp_Equal;
  215. } // end of func
  216. // **********************************************************************
  217.  
  218. public:  TC_CBCD& operator += (TC_CBCD & bcd) 
  219. {
  220. Add(bcd, op_Add);
  221. return *this;
  222.  
  223. } // end of func
  224. // **********************************************************************
  225.  
  226. public:  TC_CBCD& operator -= (TC_CBCD & bcd) 
  227. {
  228. Add(bcd, op_Sub);
  229. return *this;
  230.  
  231. } // end of func
  232. // **********************************************************************
  233.  
  234. public:  TC_CBCD& operator *= (TC_CBCD & bcd) 
  235. {
  236. Mul(bcd);
  237. return *this;
  238.  
  239. } // end of func
  240. // **********************************************************************
  241.  
  242. public:  TC_CBCD& operator /= (TC_CBCD & bcd) 
  243. {
  244. Div(bcd);
  245. return *this;
  246.  
  247. } // end of func
  248. // **********************************************************************
  249.  
  250. public:  int operator ! () 
  251. {
  252. return IsZero();
  253. } // end of func
  254. // **********************************************************************
  255.  
  256. public:  TC_CBCD operator - () 
  257. {
  258. return TC_CBCD(*this).Neg();
  259. } // end of func
  260. // **********************************************************************
  261.  
  262. public:  TC_CBCD & operator ++ (int) 
  263. {
  264. TC_CBCD bcd(m_P, m_S, 1);
  265. Add(bcd,op_Add);
  266. return *this;
  267. } // end of func
  268. // **********************************************************************
  269.  
  270. public:  TC_CBCD & operator ++ () 
  271. {
  272. TC_CBCD bcd(m_P, m_S, 1);
  273. Add(bcd,op_Add);
  274. return *this;
  275. } // end of func
  276. // **********************************************************************
  277.  
  278. public:  TC_CBCD & operator -- (int) 
  279. {
  280. TC_CBCD bcd(m_P, m_S, 1);
  281. Add(bcd,op_Sub);
  282. return *this;
  283. } // end of func
  284. // **********************************************************************
  285.  
  286. public:  TC_CBCD & operator -- () 
  287. {
  288. TC_CBCD bcd(m_P, m_S, 1);
  289. Add(bcd,op_Sub);
  290. return *this;
  291. } // end of func
  292. // **********************************************************************
  293.  
  294. public:  TC_CBCD& operator = (TC_CBCD& val) 
  295. {
  296. Assign(val);
  297. return *this;
  298. } // end of func
  299. // **********************************************************************
  300.  
  301. public:  TC_CBCD& operator = (int val) 
  302. {
  303. SetFromLong((long)val);
  304. return *this;
  305. } // end of func
  306. // **********************************************************************
  307.  
  308. public:  TC_CBCD& operator = ( long val) 
  309. {
  310. SetFromLong(val);
  311. return *this;
  312. } // end of func
  313. // **********************************************************************
  314.  
  315. public:  TC_CBCD& operator = ( unsigned long val) 
  316. {
  317. SetFromLong(val);
  318. return *this;
  319. } // end of func
  320. // **********************************************************************
  321.  
  322. public:  TC_CBCD& operator = ( double val) 
  323. {
  324. SetFromDouble(val);
  325. return *this;
  326. } // end of func
  327. // **********************************************************************
  328.  
  329. public:  TC_CBCD& operator = ( char * val) 
  330. {
  331. SetValue(val);
  332. return *this;
  333. } // end of func
  334. // **********************************************************************
  335.  
  336. private:  void Reset ()  ;
  337. private:  unsigned char * Body ()  ;
  338. private:  void SetDigit (unsigned char digit, int pos)  ;
  339. private:  unsigned char GetDigit (int pos)  ;
  340. private:  int WholeDigits ()  ;
  341. private:  int WholeBegin ()  ;
  342. private:  int FractLen ()  ;
  343. private:  unsigned char GetCommonP (TC_CBCD & bcd1, TC_CBCD & bcd2)  ;
  344. private:  signed char GetCommonS (TC_CBCD & bcd1, TC_CBCD & bcd2)  ;
  345. private:  void Normalize (unsigned char P, signed char S)  ;
  346. private:  int SignificantDigits (BOOL no_trail)  ;
  347. private:  BOOL LShift ()  ;
  348. private:  BOOL RShift ()  ;
  349. private:  int CompareTo (TC_CBCD & bcd, BOOL is_abs = FALSE)  ;
  350. private:  TC_CBCD & SetFromDouble (double val)  ;
  351. private:  int SetFromString (const char* str, char * fmt, BOOL is_test )  ;
  352. private:  TC_CBCD & SetFromLong (long val)  ;
  353.  
  354. }; // end of class TC_CBCD
  355.  
  356. // **********************************************************************
  357.  
  358. #endif // _INC_BCD_HPP
  359.