1 /******************************************************************************
2 * Copyright (c) 2004, 2008 IBM Corporation
4 * This program and the accompanying materials
5 * are made available under the terms of the BSD License
6 * which accompanies this distribution, and is available at
7 * http://www.opensource.org/licenses/bsd-license.php
10 * IBM Corporation - initial implementation
11 *****************************************************************************/
19 static const unsigned long long convert[] = {
20 0x0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF,
21 0xFFFFFFFFFFULL, 0xFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL
25 print_str_fill(char **buffer, size_t bufsize, char *sizec,
26 const char *str, char c)
29 char *bstart = *buffer;
31 sizei = strtoul(sizec, NULL, 10);
35 (i < (sizei - len)) && ((*buffer - bstart) < bufsize);
45 print_str(char **buffer, size_t bufsize, const char *str)
47 char *bstart = *buffer;
50 for (i = 0; (i < strlen(str)) && ((*buffer - bstart) < bufsize); i++) {
58 print_intlen(unsigned long value, unsigned short int base)
72 print_itoa(char **buffer, size_t bufsize, unsigned long value,
73 unsigned short base, bool upper)
75 const char zeichen[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
79 if(base <= 2 || base > 16)
82 len = i = print_intlen(value, base);
84 /* Don't print to buffer if bufsize is not enough. */
89 c = zeichen[value % base];
105 print_fill(char **buffer, size_t bufsize, char *sizec, unsigned long size,
106 unsigned short int base, char c, int optlen)
109 char *bstart = *buffer;
111 sizei = strtoul(sizec, NULL, 10);
112 len = print_intlen(size, base) + optlen;
115 (i < (sizei - len)) && ((*buffer - bstart) < bufsize);
127 print_format(char **buffer, size_t bufsize, const char *format, void *var)
130 unsigned int i = 0, length_mod = sizeof(int);
131 unsigned long value = 0;
132 unsigned long signBit;
133 char *form, sizec[32];
137 form = (char *) format;
141 if(*form == '0' || *form == '.') {
146 while ((*form != '\0') && ((*buffer - start) < bufsize)) {
152 value = (unsigned long) var;
153 signBit = 0x1ULL << (length_mod * 8 - 1);
154 if ((*form != 'u') && (signBit & value)) {
157 value = (-(unsigned long)value) & convert[length_mod];
159 print_fill(buffer, bufsize - (*buffer - start),
160 sizec, value, 10, sign, 0);
161 print_itoa(buffer, bufsize - (*buffer - start),
168 value = (unsigned long) var & convert[length_mod];
169 print_fill(buffer, bufsize - (*buffer - start),
170 sizec, value, 16, sign, 0);
171 print_itoa(buffer, bufsize - (*buffer - start),
177 value = (long int) var & convert[length_mod];
178 print_fill(buffer, bufsize - (*buffer - start),
179 sizec, value, 8, sign, 0);
180 print_itoa(buffer, bufsize - (*buffer - start),
185 print_fill(buffer, bufsize - (*buffer - start),
186 sizec, (unsigned long) var, 16, ' ', 2);
187 print_str(buffer, bufsize - (*buffer - start),
189 print_itoa(buffer, bufsize - (*buffer - start),
190 (unsigned long) var, 16, upper);
194 print_fill(buffer, bufsize - (*buffer - start),
195 sizec, 1, 10, ' ', 0);
196 **buffer = (unsigned long) var;
201 print_str_fill(buffer,
202 bufsize - (*buffer - start), sizec,
205 print_str(buffer, bufsize - (*buffer - start),
211 length_mod = sizeof(long long int);
214 length_mod = sizeof(long int);
220 length_mod = sizeof(signed char);
223 length_mod = sizeof(short int);
227 length_mod = sizeof(size_t);
230 if(*form >= '0' && *form <= '9')
237 return (long int) (*buffer - start);
242 * The vsnprintf function prints a formated strings into a buffer.
243 * BUG: buffer size checking does not fully work yet
246 vsnprintf(char *buffer, size_t bufsize, const char *format, va_list arg)
251 ptr = (char *) format;
254 * Return from here if size passed is zero, otherwise we would
255 * overrun buffer while setting NULL character at the end.
257 if (!buffer || !bufsize)
260 /* Leave one space for NULL character */
263 while(*ptr != '\0' && (buffer - bstart) < bufsize)
273 } while(!(*ptr == 'd' || *ptr == 'i' || *ptr == 'u' || *ptr == 'x' || *ptr == 'X'
274 || *ptr == 'p' || *ptr == 'c' || *ptr == 's' || *ptr == '%'
275 || *ptr == 'O' || *ptr == 'o' ));
281 print_format(&buffer,
282 bufsize - (buffer - bstart),
283 formstr, va_arg(arg, void *));
297 return (buffer - bstart);