libpropeller
Making PropellerGCC Easier
 All Classes Files Functions Variables Enumerations Enumerator Macros Pages
numbers.h
Go to the documentation of this file.
1 #ifndef LIBPROPELLER_NUMBERS_H_
2 #define LIBPROPELLER_NUMBERS_H_
3 
4 #include <string.h>
5 
10 class Numbers {
11 public:
12 
26  static char * Dec(int number, char result_string[] = NULL) {
27  if (result_string == NULL) {
28  result_string = internalBuffer;
29  }
30  //Source: http://www.cplusplus.com/articles/D9j2Nwbp/
31  int i, sign;
32 
33  if ((sign = number) < 0) /* record sign */
34  number = -number; /* make n positive */
35  i = 0;
36  do { /* generate digits in reverse order */
37  result_string[i++] = number % 10 + '0'; /* get next digit */
38  } while ((number /= 10) > 0); /* delete it */
39  if (sign < 0)
40  result_string[i++] = '-';
41  result_string[i] = '\0';
42  Reverse(result_string);
43 
44  return result_string;
45  }
46 
56  static int Dec(const char * number, const char terminator = '\0') {
57  int result = 0;
58  int index = 0;
59  bool isNegative = false;
60  if (number[index] == '-') {
61  isNegative = true;
62  index++;
63  }
64  for (; number[index] != terminator; index++) {
65  // Shift left Add 1's unit
66  result = (result * 10) + (number[index] - '0');
67  }
68 
69  if (isNegative) {
70  return -result;
71  } else {
72  return result;
73  }
74  }
75 
87  static char * Hex(int number, const int num_digits, char result_string[] = NULL) {
88  if (result_string == NULL) {
89  result_string = internalBuffer;
90  }
91  static const char characters[] = "0123456789ABCDEF";
92  int i;
93  for (i = 0; i < num_digits; i++) {
94  result_string[i] = characters[number & 0xF];
95  number >>= 4;
96  }
97  result_string[i] = 0;
98  Reverse(result_string);
99  return result_string;
100  }
101 
113  static char * Bin(int number, int num_digits, char result_string[] = NULL) {
114  if (result_string == NULL) {
115  result_string = internalBuffer;
116  }
117  // Below is C++ version:
118  static const char characters[] = "01";
119  int i;
120  for (i = 0; i < num_digits; i++) {
121  result_string[i] = characters[number & 0b1];
122  number >>= 1;
123  }
124  result_string[i] = 0;
125  Reverse(result_string);
126  return result_string;
127 
128  }
129 
134  static int DecDigits(int number) {
135  int sign = 0;
136  if (number < 0) {
137  number = -number;
138  sign = 1;
139  }
140  if (number < 100000) {
141  // 5 or less
142  if (number < 100) {
143  // 1 or 2
144  if (number < 10)
145  return 1 + sign;
146  else
147  return 2 + sign;
148  } else {
149  // 3 or 4 or 5
150  if (number < 1000)
151  return 3 + sign;
152  else {
153  // 4 or 5
154  if (number < 10000)
155  return 4 + sign;
156  else
157  return 5 + sign;
158  }
159  }
160  } else {
161  // 6 or more
162  if (number < 10000000) {
163  // 6 or 7
164  if (number < 1000000)
165  return 6 + sign;
166  else
167  return 7 + sign;
168  } else {
169  // 8 to 10
170  if (number < 100000000)
171  return 8 + sign;
172  else {
173  // 9 or 10
174  if (number < 1000000000)
175  return 9 + sign;
176  else
177  return 10 + sign;
178  }
179  }
180  }
181  }
182 
187  static int HexDigits(const int n) {
188  if ((n & 0xFFFF) == n) {
189  //4 or less
190  if ((n & 0xFF) == n) {
191  //2 or less
192  if ((n & 0xF) == n)
193  return 1;
194  else
195  return 2;
196  } else
197  //4 or 3
198  if ((n & 0xFFF) == n)
199  return 3;
200  else
201  return 4;
202 
203  } else {
204  //5 or more
205  if ((n & 0xFFFFFF) == n) {
206  //6 or 5
207  if ((n & 0xFFFFF) == n)
208  return 5;
209  else
210  return 6;
211  } else {
212  if ((n & 0xFFFFFFF) == n)
213  return 7;
214  else
215  return 8;
216  }
217  }
218  }
219 
227  static char * Reverse(char s[]) {
228  //Source: http://www.cplusplus.com/articles/D9j2Nwbp/
229  int i, j;
230  char c;
231 
232  for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
233  c = s[i];
234  s[i] = s[j];
235  s[j] = c;
236  }
237  return s;
238  }
239 
240 private:
241 
245  static char internalBuffer[];
246 };
247 
248 #endif // LIBPROPELLER_NUMBERS_H_