1+ #include "printf.h"
2+
3+ int is_fmt_letter (char c )
4+ {
5+ return c == 'c' || c == 'd' || c == 'i' || c == 'e' || c == 'E' || c == 'f' || c == 'g' || c == 'G' || c == 'o' || c == 's' || c == 'u' || c == 'x' || c == 'X' || c == 'p' || c == 'n' ;
6+ }
7+
8+ void vsprintf (char * str , void (* putchar )(char ), const char * fmt , va_list arg )
9+ {
10+ static uint32_t * pos ;
11+ char c ;
12+ int sign , ival , sys ;
13+ char buf [512 ];
14+ char width_str [10 ];
15+ uint32_t uval ;
16+ uint32_t size = 8 ;
17+ uint32_t i ;
18+ int size_override = 0 ;
19+ memset (buf , 0 , 512 );
20+
21+ while ((c = * fmt ++ ) != 0 )
22+ {
23+ sign = 0 ;
24+
25+ if (c == '%' )
26+ {
27+ c = * fmt ++ ;
28+ switch (c )
29+ {
30+ case '0' :
31+ size_override = 1 ;
32+ i = 0 ;
33+ c = * fmt ;
34+ while (!is_fmt_letter (c ))
35+ {
36+ width_str [i ++ ] = c ;
37+ fmt ++ ;
38+ c = * fmt ;
39+ }
40+ width_str [i ] = 0 ;
41+ fmt ++ ;
42+ size = atoi (width_str );
43+ case 'd' :
44+ case 'u' :
45+ case 'x' :
46+ case 'p' :
47+ {
48+ if (c == 'd' || c == 'u' )
49+ sys = 10 ;
50+ else
51+ sys = 16 ;
52+ uval = ival = va_arg (arg , int );
53+ if (c == 'd' && ival < 0 )
54+ {
55+ sign = 1 ;
56+ uval = - ival ;
57+ }
58+ itoa (buf , uval , sys );
59+ uint32_t len = strlen (buf );
60+ if (!size_override )
61+ size = len ;
62+ if ((c == 'x' || c == 'p' || c == 'd' ) && len < size )
63+ {
64+ for (i = 0 ; i < len ; i ++ )
65+ {
66+ buf [size - 1 - i ] = buf [len - 1 - i ];
67+ }
68+ for (i = 0 ; i < size - len ; i ++ )
69+ {
70+ buf [i ] = '0' ;
71+ }
72+ }
73+ if (c == 'd' && sign )
74+ {
75+ if (str )
76+ {
77+ * (str + * pos ) = '-' ;
78+ * pos = * pos + 1 ;
79+ }
80+ else
81+ (* putchar )('-' );
82+ }
83+ if (str )
84+ {
85+ strcpy (str + * pos , buf );
86+ * pos = * pos + strlen (buf );
87+ }
88+ else
89+ {
90+ char * t = buf ;
91+ while (* t )
92+ {
93+ putchar (* t );
94+ t ++ ;
95+ }
96+ }
97+ }
98+ break ;
99+ case 'c' :
100+ {
101+ if (str )
102+ {
103+ * (str + * pos ) = (char )va_arg (arg , int );
104+ * pos = * pos + 1 ;
105+ }
106+ else
107+ {
108+ (* putchar )((char )va_arg (arg , int ));
109+ }
110+ }break ;
111+ case 's' :
112+ {
113+ if (str )
114+ {
115+ char * t = (char * )va_arg (arg , int );
116+ strcpy (str + (* pos ), t );
117+ * pos = * pos + strlen (t );
118+ }
119+ else
120+ {
121+ char * t = (char * )va_arg (arg , int );
122+ while (* t )
123+ {
124+ putchar (* t );
125+ t ++ ;
126+ }
127+ }
128+ }
129+ break ;
130+ default :
131+ break ;
132+ }
133+ continue ;
134+ }
135+ if (str )
136+ {
137+ * (str + * pos ) = c ;
138+ * pos = * pos + 1 ;
139+ }
140+ else
141+ {
142+ (* putchar )(c );
143+ }
144+ }
145+ }
146+
147+ void printf (const char * fmt , ...)
148+ {
149+ va_list args ;
150+ va_start (args , fmt );
151+ vsprintf (NULL , text_putc , fmt , args );
152+ va_end (args );
153+ }
0 commit comments