fgms 0.11.8
The
FlightGear MultiPlayer Server
project
fg_util.hxx
Go to the documentation of this file.
1 /**
2  * @file fg_util.hxx
3  * @author Oliver Schroeder
4  *
5  */
6 
7 #ifndef TYPCNVTHDR
8 #define TYPCNVTHDR 1
9 
10 using namespace std;
11 
12 #ifdef HAVE_CONFIG_H
13  #include <config.h>
14 #endif
15 
16 #include <string>
17 #include <cstdlib>
18 #include <ctype.h> // toupper()
19 #include <stdint.h>
20 
21 typedef long long t_longlong;
22 
23 #if __FreeBSD__ || defined(__CYGWIN__)
24  namespace std {
25  template < typename T >
26  T abs(T x) {
27  return x < 0 ? -x : x;
28  }
29  template < typename T >
30  T llabs(T x) {
31  return x < 0 ? -x : x;
32  }
33  }
34 #endif
35 
37 {
38  MIN_BASE = 2,
39  MAX_BASE = 36 // 0-9, a-z
40 };
41 
42 std::string timestamp_to_datestr ( time_t date );
43 std::string timestamp_to_days ( time_t date );
44 std::string diff_to_days ( time_t date );
45 std::string byte_counter ( double bytes );
46 
47 //////////////////////////////////////////////////////////////////////
48 /**
49  * @brief Convert string into a number
50  * @param str_Number the string representation of a number
51  * @param n_Error if an error (illegal char) occured, n_Error
52  * point to the position
53  * @param n_Base The base of the string representation
54  * @return
55  * - n_Error -1: empty string
56  * - n_Error -2: overflow
57  * - n_Error -3: base out of range
58  * - n_Error >0: index of non-numeric
59  */
60 template < class T >
61 T StrToNum (string str_Number, int &n_Error, int n_Base = 10)
62 {
63  int n_Length;
64  int n_Current;
65  int n_Index = 0;
66  bool b_IsNegative = false;
67  T T_Result = 0;
68  T T_Tmp = 0;
69  T T_Devisor = 1;
70  T T_Exponent = 1;
71  T T_Current;
72 
73  if ((n_Base < MIN_BASE) || (n_Base > MAX_BASE))
74  {
75  n_Error = -3;
76  return (0);
77  }
78  if (str_Number.size () <= 0)
79  {
80  //////////////////////////////////////////////////
81  //
82  // string with zero-length -> error
83  //
84  //////////////////////////////////////////////////
85  n_Error = -1;
86  return (0);
87  }
88  //////////////////////////////////////////////////
89  //
90  // remember signedness
91  //
92  //////////////////////////////////////////////////
93  if (str_Number[n_Index] == '-')
94  {
95  b_IsNegative = true;
96  n_Index++;
97  }
98  else if (str_Number[n_Index] == '+')
99  {
100  n_Index++;
101  }
102  //////////////////////////////////////////////////
103  //
104  // walk through the string
105  //
106  //////////////////////////////////////////////////
107  n_Error = 0;
108  n_Length = str_Number.size () - 1;
109  while ((n_Index <= n_Length) && (str_Number[n_Index] != '.')
110  && (str_Number[n_Index] != ','))
111  {
112  T_Tmp = T_Result;
113  n_Current = str_Number[n_Index];
114  if ((n_Current < '0') || (n_Current > '9'))
115  {
116  n_Current = toupper (n_Current);
117  n_Current -= ('A' - 10);
118  }
119  else
120  {
121  n_Current -= '0';
122  }
123  if ((n_Current < 0) || (n_Current > n_Base))
124  {
125  // character is not a number
126  n_Error = n_Index + 1;
127  return (T_Result);
128  }
129  T_Result *= n_Base;
130  T_Result += n_Current;
131  if (T_Result < T_Tmp)
132  {
133  // overflow
134  n_Error = -2;
135  return (T_Result);
136  }
137  n_Index++;
138  }
139  //////////////////////////////////////////////////
140  //
141  // now for the floating point part
142  //
143  //////////////////////////////////////////////////
144  n_Index++;
145  T_Devisor = 1 / (T) n_Base;
146  T_Exponent = 1 * T_Devisor;
147  while (n_Index <= n_Length)
148  {
149  T_Tmp = T_Result;
150  n_Current = str_Number[n_Index];
151  if ((n_Current < '0') || (n_Current > '9'))
152  {
153  n_Current = toupper (n_Current);
154  n_Current -= ('A' - 10);
155  }
156  else
157  {
158  n_Current -= '0';
159  }
160  if ((n_Current < 0) || (n_Current > n_Base))
161  {
162  // character is not a number
163  n_Error = n_Index;
164  return (T_Result);
165  }
166  T_Current = n_Current * T_Exponent;
167  T_Result += T_Current;
168  T_Exponent *= T_Devisor;
169  if (T_Result < T_Tmp)
170  {
171  // overflow
172  n_Error = -2;
173  return (T_Result);
174  }
175  n_Index++;
176  }
177  if (b_IsNegative)
178  {
179  T_Result = -T_Result;
180  }
181  return (T_Result);
182 } // StrToNum ()
183 //////////////////////////////////////////////////////////////////////
184 
185 //////////////////////////////////////////////////////////////////////
186 /**
187  * @brief Convert a number to string
188  * @param n_Number the number to convert
189  * @param n_Precision number of digits after the dot
190  * @param n_Base the base of the string representation
191  */
192 template < typename T >
193 string NumToStr ( T n_Number, int n_Precision = 2, int n_Base = 10 )
194 {
195  const char Numbers[] = "0123456789abcdef";
196  string str_Return = "";
197  t_longlong n_WorkNumber;
198  int n_Factor;
199  int n;
200 
201  if (n_Number == 0)
202  {
203  return "0";
204  }
205  if ((n_Base < 2) || (n_Base > 16))
206  {
207  return ("0");
208  }
209  //////////////////////////////////////////////////
210  //
211  // for the floating point part
212  //
213  //////////////////////////////////////////////////
214  if (n_Precision != 0)
215  {
216  n_Factor = 1;
217  for (int i=n_Precision; i>0; i--)
218  {
219  n_Factor *= n_Base;
220  }
221  T tmp;
222  tmp = n_Number - ((t_longlong) n_Number);
223  n_WorkNumber = (t_longlong) (tmp * n_Factor);
224  n_WorkNumber = (t_longlong) n_WorkNumber;
225  if ((n_WorkNumber == 0) && (tmp != 0))
226  {
227  str_Return = "0" + str_Return;
228  }
229  else
230  {
231  n = n_Factor;
232 #if defined(_MSC_VER) && (!defined(NTDDI_VERSION) || !defined(NTDDI_VISTA) || (NTDDI_VERSION < NTDDI_VISTA)) // if less than VISTA, provide alternative
233  n_WorkNumber = abs((int)n_WorkNumber);
234 #else
235  n_WorkNumber = std::llabs(n_WorkNumber);
236 #endif
237  while (n_WorkNumber >= 0 && n > 1)
238  {
239  str_Return = Numbers[n_WorkNumber % n_Base] + str_Return;
240  n_WorkNumber /= n_Base;
241  n /= n_Base;
242  }
243  }
244  str_Return = "." + str_Return;
245  }
246  n_WorkNumber = (t_longlong) n_Number;
247  if (n_WorkNumber < 0)
248  {
249  n_WorkNumber = -n_WorkNumber;
250  }
251  if (n_WorkNumber == 0)
252  {
253  str_Return = "0" + str_Return;
254  }
255  while (n_WorkNumber > 0)
256  {
257  str_Return = Numbers[n_WorkNumber % n_Base] + str_Return;
258  n_WorkNumber /= n_Base;
259  }
260  if (n_Number < 0)
261  {
262  str_Return = "-" + str_Return;
263  }
264  return (str_Return);
265 } // NumToStr ()
266 //////////////////////////////////////////////////////////////////////
267 
268 #endif
std::string diff_to_days(time_t date)
convert a time duration expressed in seconds to a string representation of the form "3 days 2 hours" ...
Definition: fg_util.cxx:52
NUMERIC_BASE_LIMITS
Definition: fg_util.hxx:36
long long t_longlong
Definition: fg_util.hxx:21
T StrToNum(string str_Number, int &n_Error, int n_Base=10)
Convert string into a number.
Definition: fg_util.hxx:61
string NumToStr(T n_Number, int n_Precision=2, int n_Base=10)
Convert a number to string.
Definition: fg_util.hxx:193
std::string timestamp_to_days(time_t date)
calculate the difference of a timestamp to now and convert the difference to a string representation ...
Definition: fg_util.cxx:36
std::string byte_counter(double bytes)
Definition: fg_util.cxx:100
std::string timestamp_to_datestr(time_t date)
convert a unix timestamp to a string representation of a date
Definition: fg_util.cxx:11