3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
5 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include <_printf.h> /* fnptr_t */
23 #include <string.h> /* strlen() */
24 #include <stdarg.h> /* va_list, va_arg() */
28 int do_printf (const char *fmt
, va_list args
)
34 unsigned char *buf
= 0;
36 for (; *fmt
; fmt
++) {
37 /* probably argument is here */
44 if (*fmt
== 'd' || *fmt
== 'i' || *fmt
== 'u') {
45 num
= va_arg (args
, int);
49 for (i
= 0; str
[i
]; i
++)
58 num
= va_arg (args
, double);
70 f
= (int) ((double) num
* (double) 10000);
75 for (i
= 0; str
[i
]; i
++)
83 if (*fmt
== 'x' || *fmt
== 'X') {
84 num
= va_arg (args
, int);
88 for (i
= 0; str
[i
]; i
++)
97 num
= va_arg (args
, unsigned char);
99 putch ((unsigned char) num
);
107 buf
= va_arg (args
, unsigned char *);
109 for (i
= 0; buf
[i
]; i
++)
110 putch ((unsigned char) buf
[i
]);
128 int do_sprintf (const char *fmt
, va_list args
, char *ptr
, int len
)
134 unsigned char *buf
= 0;
136 for (; *fmt
; fmt
++) {
137 /* probably argument is here */
144 if (*fmt
== 'd' || *fmt
== 'i' || *fmt
== 'u') {
145 num
= va_arg (args
, int);
149 for (i
= 0; str
[i
]; i
++)
150 ptr
[i
+count
] = str
[i
];
157 if (*fmt
== 'x' || *fmt
== 'X') {
158 num
= va_arg (args
, int);
162 for (i
= 0; str
[i
]; i
++)
163 ptr
[i
+count
] = str
[i
];
171 num
= va_arg (args
, unsigned char);
173 ptr
[count
] = (unsigned char) num
;
181 buf
= va_arg (args
, unsigned char *);
183 for (i
= 0; buf
[i
]; i
++)
184 ptr
[i
+count
] = buf
[i
];
198 if (count
>= (unsigned) len
)
205 /*****************************************************************************
207 *****************************************************************************/
209 int vsprintf (char *buffer
, const char *fmt
, va_list args
)
214 int ret_val
= do_sprintf (fmt
, args
, (char *) buffer
, -1);
215 buffer
[ret_val
] = '\0';
220 /*****************************************************************************
222 *****************************************************************************/
224 int vsnprintf (char *buffer
, size_t size
, const char *fmt
, va_list args
)
229 int ret_val
= do_sprintf (fmt
, args
, (char *) buffer
, size
);
230 buffer
[ret_val
] = '\0';
235 /*****************************************************************************
237 *****************************************************************************/
239 int vfprintf (FILE *stream
, const char *fmt
, va_list args
)
244 char *buffer
= (char *) malloc (sizeof (char) * 256);
249 int ret_val
= do_sprintf (fmt
, args
, (char *) buffer
, 255);
250 buffer
[ret_val
] = '\0';
252 fwrite (buffer
, ret_val
, 1, stream
);
261 /*****************************************************************************
262 *****************************************************************************/
263 int sprintf(char *buffer
, const char *fmt
, ...)
269 ret_val
= vsprintf(buffer
, fmt
, args
);
273 /*****************************************************************************
275 You must write your own putchar()
276 *****************************************************************************/
277 int vprintf_help(unsigned c
, void **ptr
)
282 /*****************************************************************************
283 *****************************************************************************/
284 int vprintf(const char *fmt
, va_list args
)
286 return do_printf(fmt
, args
, vprintf_help
, NULL
);
288 /*****************************************************************************
289 *****************************************************************************/
290 int printf(const char *fmt
, ...)
296 ret_val
= vprintf(fmt
, args
);
300 /*****************************************************************************
301 *****************************************************************************/
306 sprintf(buf
, "%u score and %i years ago...\n", 4, -7);
309 sprintf(buf
, "-1L == 0x%lX == octal %lo\n", -1L, -1L);
312 printf("<%-08s> and <%08s> justified strings\n", "left", "right");