1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Gary Czvitkovicz
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
30 static const char hexdigit
[] = "0123456789ABCDEF";
33 /* call 'push()' for each output letter */
34 int (*push
)(void *userp
, unsigned char data
),
41 int ch
, width
, val
, sign
, precision
;
46 ssize_t szval
, szsign
;
49 tmpbuf
[sizeof tmpbuf
- 1] = '\0';
51 while ((ch
= *fmt
++) != '\0' && ok
)
61 while (ch
>= '0' && ch
<= '9')
63 width
= 10*width
+ ch
- '0';
71 while (ch
>= '0' && ch
<= '9')
73 precision
= 10*precision
+ ch
- '0';
80 str
= tmpbuf
+ sizeof tmpbuf
- 1;
84 *--str
= va_arg (ap
, int);
88 str
= va_arg (ap
, char*);
92 val
= sign
= va_arg (ap
, int);
97 *--str
= (val
% 10) + '0';
106 uval
= va_arg(ap
, unsigned int);
109 *--str
= (uval
% 10) + '0';
118 uval
= va_arg (ap
, int);
121 *--str
= hexdigit
[uval
& 0xf];
133 ulval
= va_arg (ap
, long);
136 *--str
= hexdigit
[ulval
& 0xf];
142 lval
= lsign
= va_arg (ap
, long);
147 *--str
= (lval
% 10) + '0';
156 ulval
= va_arg(ap
, unsigned long);
159 *--str
= (ulval
% 10) + '0';
176 szval
= szsign
= va_arg (ap
, ssize_t
);
181 *--str
= (szval
% 10) + '0';
190 uszval
= va_arg(ap
, size_t);
193 *--str
= (uszval
% 10) + '0';
213 width
-= strlen (str
);
214 while (width
-- > 0 && ok
)
217 while (*str
!= '\0' && ok
&& precision
--)
218 ok
=push(userp
, *str
++);
226 int fd
; /* where to store it */
227 int bytes
; /* amount stored */
230 static int fprfunc(void *pr
, unsigned char letter
)
232 struct for_fprintf
*fpr
= (struct for_fprintf
*)pr
;
233 int rc
= write(fpr
->fd
, &letter
, 1);
236 fpr
->bytes
++; /* count them */
237 return true; /* we are ok */
240 return false; /* failure */
244 int fdprintf(int fd
, const char *fmt
, ...)
247 struct for_fprintf fpr
;
253 format(fprfunc
, &fpr
, fmt
, ap
);
256 return fpr
.bytes
; /* return 0 on error */
259 void vuprintf(int (*push
)(void *userp
, unsigned char data
), void *userp
, const char *fmt
, va_list ap
)
261 format(push
, userp
, fmt
, ap
);