1
6
7
16
17
18
19
20
21
22
23
24
25
26
27
28
37
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
67
73
77
85
86
95
96
99
100
101
102
103
104
106
108
109
116
117
131
132
134
135
136
137
143
144
145
146
147
148
149
150
151
152
153
156
157
160
163
164
165
166
167
179
180
186
187
188
189
190
191
192
193
194
195
196
197
200
201
202
203
206
210
211
212
213
216
219
229
235
239
243
248
254
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/* ... */
#include <stdint.h>
#include <stdbool.h>
#include <stdarg.h>
#include <stddef.h>
#include <sys/param.h>
#include "esp_rom_caps.h"
#include "esp_rom_sys.h"
#include "rom/ets_sys.h"
#include "sdkconfig.h"9 includes
#if !ESP_ROM_HAS_VPRINTF_FUNC
static int _cvt(unsigned long long val, char *buf, long radix, const char *digits)
{
#ifdef SUPPORT_LITTLE_RADIX
char temp[64];
#else
char temp[32];
#endif
char *cp = temp;
int length = 0;
if (val == 0) {
*cp++ = '0';
}{...} else {
while (val) {
*cp++ = digits[val % radix];
val /= radix;
}{...}
}{...}
while (cp != temp) {
*buf++ = *--cp;
length++;
}{...}
*buf = '\0';
return (length);
}{ ... }
#define is_digit(c) ((c >= '0') && (c <= '9'))
static int ets_vprintf(void (*putc)(char c), const char *fmt, va_list ap)
{
#ifdef BINARY_SUPPORT
char buf[sizeof(long long)*8];
#else
char buf[32];
#endif
char c, sign, *cp=buf;
int left_prec, right_prec, zero_fill, pad, pad_on_right,
islong, islonglong;
long long val = 0;
int res = 0, length = 0;
while ((c = *fmt++) != '\0') {
if (c == '%') {
c = *fmt++;
left_prec = right_prec = pad_on_right = islong = islonglong = 0;
if (c == '-') {
c = *fmt++;
pad_on_right++;
}{...}
if (c == '0') {
zero_fill = true;
c = *fmt++;
}{...} else {
zero_fill = false;
}{...}
while (is_digit(c)) {
left_prec = (left_prec * 10) + (c - '0');
c = *fmt++;
}{...}
if (c == '.') {
c = *fmt++;
zero_fill = false;
while (is_digit(c)) {
right_prec = (right_prec * 10) + (c - '0');
c = *fmt++;
}{...}
}{...}
sign = '\0';
if (c == 'l') {
c = *fmt++;
islong = 1;
if (c == 'l') {
c = *fmt++;
islonglong = 1;
islong = 0;
}{...}
}{...}
switch (c) {
case 'p':
islong = 1;
...
case 'd':
case 'D':
case 'x':
case 'X':
case 'u':
case 'U':
#ifdef BINARY_SUPPORT...
case 'b':
case 'B':/* ... */
#endif
if (islonglong) {
val = va_arg(ap, long long);
}{...} else if (islong) {
val = (long long)va_arg(ap, long);
}{...} else {
val = (long long)va_arg(ap, int);
}{...}
if ((c == 'd') || (c == 'D')) {
if (val < 0) {
sign = '-';
val = -val;
}{...}
}{...} else {
if (islonglong) {
;
}{...} else if (islong) {
val &= ((long long)1 << (sizeof(long) * 8)) - 1;
}{...} else {
val &= ((long long)1 << (sizeof(int) * 8)) - 1;
}{...}
}{...}
break;
default:
break;...
}{...}
switch (c) {
case 'p':
(*putc)('0');
(*putc)('x');
zero_fill = true;
left_prec = sizeof(unsigned long)*2;
...
case 'd':
case 'D':
case 'u':
case 'U':
case 'x':
case 'X':
switch (c) {
case 'd':
case 'D':
case 'u':
case 'U':
length = _cvt(val, buf, 10, "0123456789");
break;...
case 'p':
case 'x':
length = _cvt(val, buf, 16, "0123456789abcdef");
break;...
case 'X':
length = _cvt(val, buf, 16, "0123456789ABCDEF");
break;...
}{...}
cp = buf;
break;...
case 's':
case 'S':
cp = va_arg(ap, char *);
if (cp == NULL) {
cp = (char *)"<null>";
}{...}
length = 0;
while (cp[length] != '\0') length++;
if (right_prec) {
length = MIN(right_prec, length);
right_prec = 0;
}{...}
break;...
case 'c':
case 'C':
c = va_arg(ap, int );
(*putc)(c);
res++;
continue;
#ifdef BINARY_SUPPORT...
case 'b':
case 'B':
length = left_prec;
if (left_prec == 0) {
if (islonglong)
length = sizeof(long long)*8;
else if (islong)
length = sizeof(long)*8;
else
length = sizeof(int)*8;
}{...}
for (i = 0; i < length-1; i++) {
buf[i] = ((val & ((long long)1<<i)) ? '1' : '.');
}{...}
cp = buf;
break;/* ... */
#endif
case '%':
(*putc)('%');
break;...
default:
(*putc)('%');
(*putc)(c);
res += 2;...
}{...}
pad = left_prec - length;
right_prec = right_prec - length;
if (right_prec > 0) {
pad -= right_prec;
}{...}
if (sign != '\0') {
pad--;
}{...}
if (zero_fill) {
c = '0';
if (sign != '\0') {
(*putc)(sign);
res++;
sign = '\0';
}{...}
}{...} else {
c = ' ';
}{...}
if (!pad_on_right) {
while (pad-- > 0) {
(*putc)(c);
res++;
}{...}
}{...}
if (sign != '\0') {
(*putc)(sign);
res++;
}{...}
while (right_prec-- > 0) {
(*putc)('0');
res++;
}{...}
while (length-- > 0) {
c = *cp++;
(*putc)(c);
res++;
}{...}
if (pad_on_right) {
while (pad-- > 0) {
(*putc)(' ');
res++;
}{...}
}{...}
}{...} else {
(*putc)(c);
res++;
}{...}
}{...}
return (res);
}{ ... }
#endif/* ... */
#if CONFIG_IDF_TARGET_LINUX
int esp_rom_printf(const char *fmt, ...)
{
va_list list;
va_start(list, fmt);
int result = ets_vprintf(esp_rom_output_to_channels, fmt, list);
va_end(list);
return result;
}{...}
/* ... */#endif
int esp_rom_vprintf(const char *fmt, va_list ap)
{
return ets_vprintf(esp_rom_output_to_channels, fmt, ap);
}{ ... }