1 /* $Id: numeric_convert.cpp 461606 2015-03-11 15:25:49Z ucko $
2  * ===========================================================================
3  *
4  *                            PUBLIC DOMAIN NOTICE
5  *               National Center for Biotechnology Information
6  *
7  *  This software/database is a "United States Government Work" under the
8  *  terms of the United States Copyright Act.  It was written as part of
9  *  the author's official duties as a United States Government employee and
10  *  thus cannot be copyrighted.  This software/database is freely available
11  *  to the public for use. The National Library of Medicine and the U.S.
12  *  Government have not placed any restriction on its use or reproduction.
13  *
14  *  Although all reasonable efforts have been taken to ensure the accuracy
15  *  and reliability of the software and data, the NLM and the U.S.
16  *  Government do not and cannot warrant the performance or results that
17  *  may be obtained by using this software or data. The NLM and the U.S.
18  *  Government disclaim all warranties, express or implied, including
19  *  warranties of performance, merchantability or fitness for any particular
20  *  purpose.
21  *
22  *  Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author:  Vladimir Soussov
27  *
28  * File Description: Numeric conversions
29  *
30  */
31 
32 
33 #include <ncbi_pch.hpp>
34 #include <corelib/ncbistd.hpp>
35 #include <string>
36 #include <stdio.h>
37 
38 
39 BEGIN_NCBI_SCOPE
40 
41 
42 #define MAXPRECISION 		50
43 
44 
45 static int s_NumericBytesPerPrec[] =
46 {2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9,
47  10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15,
48  16, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21,
49  22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26};
50 
51 
52 NCBI_DBAPIDRIVER_EXPORT
longlong_to_numeric(Int8 l_num,unsigned int prec,unsigned char * cs_num)53 unsigned char*  longlong_to_numeric (Int8 l_num, unsigned int prec, unsigned char* cs_num)
54 {
55     bool needs_del= false;
56 
57     if(prec == 0) return 0;
58 
59     if (cs_num == 0) {
60         cs_num= new unsigned char[MAXPRECISION];
61         needs_del= true;
62     }
63     memset (cs_num, 0, prec);
64 
65     int BYTE_NUM = s_NumericBytesPerPrec[prec-1];
66     unsigned char* number = &cs_num[BYTE_NUM - 1];
67     if (l_num != 0) {
68         if (l_num < 0) {
69             l_num *= (-1);
70             cs_num[0] = 0x1;
71         }
72         while (l_num != 0 && number >= cs_num) {
73             Int8 rem = l_num%256;
74             *number = (unsigned char)rem;
75             l_num = l_num/256;
76             number--;
77             if (number <= cs_num) {
78                 if (needs_del) delete[] cs_num;
79                 return 0;
80             }
81         }
82     }
83     return cs_num;
84 
85 }
86 
87 
88 NCBI_DBAPIDRIVER_EXPORT
numeric_to_longlong(unsigned int precision,unsigned char * cs_num)89 Int8 numeric_to_longlong(unsigned int precision, unsigned char* cs_num)
90 
91 {
92 
93     if(precision == 0) return 0;
94 
95     int BYTE_NUM = s_NumericBytesPerPrec[precision - 1];
96     Int8 my_long = 0;
97 
98     for (int i = 1; i < BYTE_NUM; i++) {
99         if (my_long > kMax_I8 >> 8) {
100             return 0;
101         }
102         my_long = my_long*256 + cs_num[i];
103     }
104     if (cs_num[0] != 0) {
105         my_long*= -1;
106     }
107 
108     return my_long;
109 }
110 
111 
112 NCBI_DBAPIDRIVER_EXPORT
swap_numeric_endian(unsigned int precision,unsigned char * num)113 void swap_numeric_endian(unsigned int precision, unsigned char* num)
114 {
115     if(precision == 0) return;
116 
117     int BYTE_NUM= s_NumericBytesPerPrec[precision - 1] - 1;
118     unsigned char c;
119     int i, j;
120 
121     for(i= 0, j= BYTE_NUM-1; i < j; i++, j--) {
122         c= num[i];
123         num[i]= num[j];
124         num[j]= c;
125     }
126 }
127 
128 
129 END_NCBI_SCOPE
130 
131