3 Date of creation : 05/12/2022
5 Copyright : Soft'n'design
6 Author : Laurent Mazet <mazet@softndesign.org>
8 Description : This file contains embedded printf
20 int stdfdin
= STDIN_FILENO
;
21 int stdfdout
= STDOUT_FILENO
;
22 int stdfderr
= STDERR_FILENO
;
24 unsigned int nextpow (unsigned int x
, int base
) {
30 return (n
== 0) ? 1 : n
;
33 char *itoa (char *str
, unsigned u
, unsigned int sz
)
35 unsigned int i
= (sz
== 0 ) ? nextpow (u
, 10) : sz
;
38 str
[i
- 1] = '0' + (u
% 10);
46 double tenpower(int n
)
50 for (i
= 0; i
< n
; i
++) {
53 for (i
= 0; i
> n
; i
--) {
59 int getexponant (double *f
, int maxexp
)
70 *f
+= tenpower (maxexp
- 1);
78 /* simple fprintf function */
80 int fdprintf (int fd
, const char *fmt
, ...)
82 char buffer
[1024 + 1] = { 0 };
94 /* copy standard char */
104 if ((*fmt
== ' ') || (*fmt
== '0')) {
109 if ((*fmt
>= '1') && (*fmt
<= '9')) {
113 /* process format char */
115 case '%': /* percent */
119 c
= (char) va_arg (ap
, int);
123 d
= va_arg (ap
, int);
130 case 'u': /* unsigned int */
131 str
= itoa (str
, (t
) ? (unsigned int)d
: va_arg (ap
, unsigned int), 0);
133 case 'f': /* float */
134 f
= va_arg (ap
, double);
144 t
= getexponant (&f
, -sz
);
146 str
= itoa (str
, u
, 0);
147 d
= (int)((f
- u
) * tenpower (sz
));
150 str
= itoa (str
, d
, sz
);
152 while (*(str
- 1) == '0') {
161 str
= itoa (str
, t
, 0);
164 case 'p': /* pointer */
168 sz
= sizeof (void *) * 2;
169 p
= va_arg (ap
, void *);
171 case 'x': /* integer hexa */
173 u
= va_arg (ap
, unsigned int);
175 sz
= nextpow (u
, 16);
180 for (i
= sz
, t
= 1; i
> 0; i
--) {
181 char x
= (char)((u
>> (i
* 4 - 4)) & 0xf);
182 if ((t
== 1) && (x
== 0)) {
185 *str
++ = (x
> 9) ? 'a' + x
- 10 : '0' + x
;
190 case 's': /* string */
191 s
= va_arg (ap
, char *);
203 int n
= str
- buffer
;
204 if (n
< (int)sizeof (buffer
) - 1) {
205 return write (fd
, buffer
, n
);
210 /* vim: set ts=4 sw=4 et: */