uc-sdk
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
osdebug.c
Go to the documentation of this file.
1 #include <stdarg.h>
2 #include <string.h>
3 #include <stdint.h>
4 #include <BoardConsole.h>
5 #include <osdebug.h>
6 
7 static const char hex_conv[] = "0123456789ABCDEF";
8 static void dbgput(const void * _str, int n) {
9  const char * str = (const char *) _str;
10  while(n--)
11  BoardConsolePutc(*(str++));
12 }
13 
14 void osDbgPrintf(const char * str, ...) {
15  if (!str)
16  return;
17 
18  va_list ap;
19  const char * percent;
20  const char * ptr = str;
21  int entry_size;
22  char tmp_n_conv[33], * tmp_conv_ptr;
23 
24  int seen_something;
25 
26  int arg_c;
27  char * arg_s;
28  unsigned long arg_u = 0;
29  long arg_i;
30  uintptr_t arg_p;
31  int str_size, i;
32 
33  va_start(ap, str);
34 
35  while ((percent = strchr(ptr, '%'))) {
36  dbgput(ptr, percent - ptr);
37  ptr = percent + 1;
38  entry_size = 0;
39  while ((*ptr >= '0') && (*ptr <= '9')) {
40  entry_size *= 10;
41  entry_size += *ptr - '0';
42  ptr++;
43  }
44  switch (*ptr) {
45  case '%':
46  dbgput("%", 1);
47  break;
48  case 'c':
49  arg_c = va_arg(ap, int);
50  dbgput(&arg_c, 1);
51  break;
52  case 's':
53  arg_s = va_arg(ap, char *);
54  if (arg_s) {
55  for (str_size = strlen(arg_s); str_size < entry_size; str_size++)
56  dbgput(" ", 1);
57  dbgput(arg_s, strlen(arg_s));
58  } else {
59  for (str_size = 0; str_size < entry_size; str_size++)
60  dbgput(" ", 1);
61  }
62  break;
63  case 'i':
64  case 'd':
65  arg_i = va_arg(ap, long);
66  if (arg_i < 0) {
67  dbgput("-", 1);
68  arg_u = -arg_i;
69  } else {
70  arg_u = arg_i;
71  }
72  case 'u':
73  if (*ptr == 'u')
74  arg_u = va_arg(ap, unsigned long);
75  tmp_conv_ptr = tmp_n_conv + 32;
76  *tmp_conv_ptr = 0;
77  do {
78  *--tmp_conv_ptr = hex_conv[arg_u % 10];
79  arg_u /= 10;
80  } while (arg_u);
81  dbgput(tmp_conv_ptr, strlen(tmp_conv_ptr));
82  break;
83  case 'p':
84  arg_p = va_arg(ap, uintptr_t);
85  dbgput("0x", 2);
86  for (i = sizeof(arg_p) * 2 - 1; i >= 0; i--) {
87  dbgput(&hex_conv[(arg_p >> (i << 2)) & 15], 1);
88  }
89  break;
90  case 'x':
91  arg_u = va_arg(ap, unsigned long);
92  seen_something = 0;
93  for (i = sizeof(arg_p) * 2 - 1; i >= 0; i--) {
94  if (!seen_something && ((arg_u >> (i << 2)) == 0))
95  continue;
96  dbgput(&hex_conv[(arg_u >> (i << 2)) & 15], 1);
97  seen_something = 1;
98  }
99  if (!seen_something)
100  dbgput("0", 1);
101  break;
102  case 0: // malformed format string with a trailing %.
103  dbgput("%", 1);
104  return;
105  default:
106  dbgput("<unsupported format: %", 22);
107  dbgput(ptr, 1);
108  dbgput(">", 1);
109  break;
110  }
111  ptr++;
112  }
113 
114  if (*ptr)
115  dbgput(ptr, strlen(ptr));
116 }