Skip to content

Commit d583af7

Browse files
Nicolas Pitrecarlescufi
Nicolas Pitre
authored andcommitted
lib/os/cbprintf_nano.c: simplifications and enhancements
Simplify the code to increase readability, and fix right-padding for %p. Also, the compiled code is smaller with those changes applied. Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
1 parent e612587 commit d583af7

File tree

1 file changed

+46
-57
lines changed

1 file changed

+46
-57
lines changed

lib/os/cbprintf_nano.c

Lines changed: 46 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -37,77 +37,72 @@ typedef uint32_t uint_value_type;
3737
BUILD_ASSERT(sizeof(uint_value_type) <= 8U,
3838
"DIGITS_BUFLEN formula may be incorrect");
3939

40+
#define OUTC(_c) do { \
41+
out((int)(_c), ctx); \
42+
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) { \
43+
++count; \
44+
} \
45+
} while (false)
46+
4047
static void print_digits(cbprintf_cb out, void *ctx, uint_value_type num,
4148
unsigned int base, bool pad_before, char pad_char,
4249
int min_width, size_t *countp)
4350
{
4451
size_t count = 0;
4552
char buf[DIGITS_BUFLEN];
46-
unsigned int i;
53+
int i = 0;
4754

48-
/* Print it backwards into the end of the buffer, low digits first */
49-
for (i = DIGITS_BUFLEN - 1U; num != 0U; i--) {
50-
buf[i] = "0123456789abcdef"[num % base];
55+
/* Print it backwards, low digits first */
56+
do {
57+
char c = num % base;
58+
if (c >= 10) {
59+
c += 'a' - '0' - 10;
60+
}
61+
buf[i++] = c + '0';
5162
num /= base;
52-
}
53-
54-
if (i == DIGITS_BUFLEN - 1U) {
55-
buf[i] = '0';
56-
} else {
57-
i++;
58-
}
63+
} while (num);
5964

60-
int pad = MAX(min_width - (int)(DIGITS_BUFLEN - i), 0);
65+
int pad = MAX(min_width - i, 0);
6166

6267
for (/**/; pad > 0 && pad_before; pad--) {
63-
out(pad_char, ctx);
64-
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) {
65-
++count;
66-
}
67-
}
68-
for (/**/; i < DIGITS_BUFLEN; i++) {
69-
out(buf[i], ctx);
70-
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) {
71-
++count;
72-
}
68+
OUTC(pad_char);
7369
}
70+
do {
71+
OUTC(buf[--i]);
72+
} while (i > 0);
7473
for (/**/; pad > 0; pad--) {
75-
out(pad_char, ctx);
76-
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) {
77-
++count;
78-
}
74+
OUTC(pad_char);
7975
}
8076

81-
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) {
82-
*countp += count;
83-
}
77+
*countp += count;
8478
}
8579

8680
static void print_hex(cbprintf_cb out, void *ctx, uint_value_type num,
87-
enum pad_type padding, int min_width, size_t *count)
81+
enum pad_type padding, int min_width, size_t *countp)
8882
{
8983
print_digits(out, ctx, num, 16U, padding != PAD_SPACE_AFTER,
9084
padding == PAD_ZERO_BEFORE ? '0' : ' ', min_width,
91-
count);
85+
countp);
9286
}
9387

9488
static void print_dec(cbprintf_cb out, void *ctx, uint_value_type num,
95-
enum pad_type padding, int min_width, size_t *count)
89+
enum pad_type padding, int min_width, size_t *countp)
9690
{
9791
print_digits(out, ctx, num, 10U, padding != PAD_SPACE_AFTER,
9892
padding == PAD_ZERO_BEFORE ? '0' : ' ', min_width,
99-
count);
93+
countp);
10094
}
10195

102-
static bool ok64(cbprintf_cb out, void *ctx, long long val, size_t *count)
96+
static bool ok64(cbprintf_cb out, void *ctx, long long val, size_t *countp)
10397
{
98+
size_t count = 0;
99+
104100
if (sizeof(int_value_type) < 8U && val != (int_value_type) val) {
105-
out('E', ctx);
106-
out('R', ctx);
107-
out('R', ctx);
108-
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) {
109-
*count += 3;
110-
}
101+
const char *cp = "ERR";
102+
do {
103+
OUTC(*cp++);
104+
} while (*cp);
105+
*countp += count;
111106
return false;
112107
}
113108
return true;
@@ -134,16 +129,9 @@ int cbvprintf(cbprintf_cb out, void *ctx, const char *fmt, va_list ap)
134129
size_t count = 0;
135130
int might_format = 0; /* 1 if encountered a '%' */
136131
enum pad_type padding = PAD_NONE;
137-
int min_width = -1;
132+
int padlen, min_width = -1;
138133
char length_mod = 0;
139134

140-
#define OUTC(_c) do { \
141-
out((int)(_c), ctx); \
142-
if (IS_ENABLED(CONFIG_CBPRINTF_LIBC_SUBSTS)) { \
143-
++count; \
144-
} \
145-
} while (false)
146-
147135
/* fmt has already been adjusted if needed */
148136
while (*fmt) {
149137
if (!might_format) {
@@ -176,10 +164,9 @@ int cbvprintf(cbprintf_cb out, void *ctx, const char *fmt, va_list ap)
176164
case '8':
177165
case '9':
178166
if (min_width < 0) {
179-
min_width = *fmt - '0';
180-
} else {
181-
min_width = 10 * min_width + *fmt - '0';
167+
min_width = 0;
182168
}
169+
min_width = 10 * min_width + *fmt - '0';
183170

184171
if (padding == PAD_NONE) {
185172
padding = PAD_SPACE_BEFORE;
@@ -247,12 +234,14 @@ int cbvprintf(cbprintf_cb out, void *ctx, const char *fmt, va_list ap)
247234
cp = "0x";
248235
}
249236

250-
while (*cp) {
237+
do {
251238
OUTC(*cp++);
252-
}
239+
} while (*cp);
253240
if (x == 0) {
254-
break;
241+
padlen = min_width - 5;
242+
goto pad_string;
255243
}
244+
min_width -= 2;
256245
} else if (length_mod == 'l') {
257246
x = va_arg(ap, unsigned long);
258247
} else if (length_mod == 'L') {
@@ -272,11 +261,11 @@ int cbvprintf(cbprintf_cb out, void *ctx, const char *fmt, va_list ap)
272261
while (*s) {
273262
OUTC(*s++);
274263
}
264+
padlen = min_width - (s - start);
275265

266+
pad_string:
276267
if (padding == PAD_SPACE_AFTER) {
277-
int remaining = min_width - (s - start);
278-
279-
while (remaining-- > 0) {
268+
while (padlen-- > 0) {
280269
OUTC(' ');
281270
}
282271
}

0 commit comments

Comments
 (0)