]> git.ipfire.org Git - people/ms/u-boot.git/blame - lib/tiny-printf.c
tiny-printf: Tidy up a few nits
[people/ms/u-boot.git] / lib / tiny-printf.c
CommitLineData
7d9cde10
SR
1/*
2 * Tiny printf version for SPL
3 *
4 * Copied from:
5 * http://www.sparetimelabs.com/printfrevisited/printfrevisited.php
6 *
7 * Copyright (C) 2004,2008 Kustaa Nyholm
8 *
9 * SPDX-License-Identifier: LGPL-2.1+
10 */
11
12#include <common.h>
13#include <stdarg.h>
14#include <serial.h>
15
16static char *bf;
7d9cde10
SR
17static char zs;
18
19static void out(char c)
20{
21 *bf++ = c;
22}
23
24static void out_dgt(char dgt)
25{
a5ecdd08 26 out(dgt + (dgt < 10 ? '0' : 'a' - 10));
7d9cde10
SR
27 zs = 1;
28}
29
a5ecdd08 30static void div_out(unsigned int *num, unsigned int div)
7d9cde10
SR
31{
32 unsigned char dgt = 0;
33
a5ecdd08
SR
34 while (*num >= div) {
35 *num -= div;
7d9cde10
SR
36 dgt++;
37 }
38
39 if (zs || dgt > 0)
40 out_dgt(dgt);
41}
42
962a43cc 43int vprintf(const char *fmt, va_list va)
7d9cde10 44{
7d9cde10
SR
45 char ch;
46 char *p;
a5ecdd08
SR
47 unsigned int num;
48 char buf[12];
49 unsigned int div;
7d9cde10 50
7d9cde10
SR
51 while ((ch = *(fmt++))) {
52 if (ch != '%') {
53 putc(ch);
54 } else {
1fb67608
SG
55 bool lz = false;
56 int width = 0;
7d9cde10
SR
57
58 ch = *(fmt++);
59 if (ch == '0') {
60 ch = *(fmt++);
61 lz = 1;
62 }
63
64 if (ch >= '0' && ch <= '9') {
1fb67608 65 width = 0;
7d9cde10 66 while (ch >= '0' && ch <= '9') {
1fb67608 67 width = (width * 10) + ch - '0';
7d9cde10
SR
68 ch = *fmt++;
69 }
70 }
71 bf = buf;
72 p = bf;
73 zs = 0;
74
75 switch (ch) {
1fb67608 76 case '\0':
7d9cde10
SR
77 goto abort;
78 case 'u':
79 case 'd':
80 num = va_arg(va, unsigned int);
81 if (ch == 'd' && (int)num < 0) {
82 num = -(int)num;
83 out('-');
84 }
74b1320a
SG
85 if (!num) {
86 out_dgt(0);
87 } else {
88 for (div = 1000000000; div; div /= 10)
89 div_out(&num, div);
90 }
7d9cde10
SR
91 break;
92 case 'x':
7d9cde10 93 num = va_arg(va, unsigned int);
74b1320a
SG
94 if (!num) {
95 out_dgt(0);
96 } else {
97 for (div = 0x10000000; div; div /= 0x10)
98 div_out(&num, div);
99 }
7d9cde10
SR
100 break;
101 case 'c':
102 out((char)(va_arg(va, int)));
103 break;
104 case 's':
105 p = va_arg(va, char*);
106 break;
107 case '%':
108 out('%');
109 default:
110 break;
111 }
112
113 *bf = 0;
114 bf = p;
1fb67608
SG
115 while (*bf++ && width > 0)
116 width--;
117 while (width-- > 0)
7d9cde10 118 putc(lz ? '0' : ' ');
8e31681c
SG
119 if (p) {
120 while ((ch = *p++))
121 putc(ch);
122 }
7d9cde10
SR
123 }
124 }
125
126abort:
7d9cde10
SR
127 return 0;
128}
962a43cc
SS
129
130int printf(const char *fmt, ...)
131{
132 va_list va;
133 int ret;
134
135 va_start(va, fmt);
136 ret = vprintf(fmt, va);
137 va_end(va);
138
139 return ret;
140}