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 *****************************************************************************/
17 const static unsigned long long convert[] = {
18 0x0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF,
19 0xFFFFFFFFFFULL, 0xFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL
25 print_itoa(char **buffer,unsigned long value, unsigned short int base)
27 const char zeichen[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
30 if(base <= 2 || base > 16)
44 **buffer = zeichen[value];
47 print_itoa(buffer, value / base, base);
48 **buffer = zeichen[(value % base)];
57 print_intlen(unsigned long value, unsigned short int base)
71 print_fill(char **buffer, char *sizec, unsigned long size, unsigned short int base, char c, int optlen)
75 sizei = strtoul(sizec, NULL, 10);
76 len = print_intlen(size, base) + optlen;
78 for(i = 0; i < (sizei - len); i++) {
89 print_format(char **buffer, const char *format, void *var)
92 unsigned int i = 0, sizei = 0, len = 0, length_mod = sizeof(int);
93 unsigned long value = 0;
94 unsigned long signBit;
95 char *form, sizec[32];
98 form = (char *) format;
99 start = (unsigned long) *buffer;
102 if(*form == '0' || *form == '.') {
107 while(*form != '\0') {
113 value = (unsigned long) var;
114 signBit = 0x1ULL << (length_mod * 8 - 1);
115 if (signBit & value) {
118 value = (-(unsigned long)value) & convert[length_mod];
120 print_fill(buffer, sizec, value, 10, sign, 0);
121 print_itoa(buffer, value, 10);
126 value = (unsigned long) var & convert[length_mod];
127 print_fill(buffer, sizec, value, 16, sign, 0);
128 print_itoa(buffer, value, 16);
133 value = (long int) var & convert[length_mod];
134 print_fill(buffer, sizec, value, 8, sign, 0);
135 print_itoa(buffer, value, 8);
139 print_fill(buffer, sizec, (unsigned long) var, 16, ' ', 2);
144 print_itoa(buffer,(unsigned long) var, 16);
148 print_fill(buffer, sizec, 1, 10, ' ', 0);
149 **buffer = (unsigned long) var;
154 sizei = strtoul(sizec, NULL, 10);
155 len = strlen((char *) var);
157 for(i = 0; i < (sizei - len); i++) {
162 for(i = 0; i < strlen((char *) var); i++) {
163 **buffer = ((char *) var)[i];
170 length_mod = sizeof(long long int);
173 length_mod = sizeof(long int);
179 length_mod = sizeof(signed char);
182 length_mod = sizeof(short int);
186 if(*form >= '0' && *form <= '9')
193 return (long int) (*buffer - start);
198 * The vsnprintf function prints a formated strings into a buffer.
199 * BUG: buffer size checking does not fully work yet
202 vsnprintf(char *buffer, size_t bufsize, const char *format, va_list arg)
207 ptr = (char *) format;
209 while(*ptr != '\0' && (buffer - bstart) < bufsize)
219 } while(!(*ptr == 'd' || *ptr == 'i' || *ptr == 'u' || *ptr == 'x' || *ptr == 'X'
220 || *ptr == 'p' || *ptr == 'c' || *ptr == 's' || *ptr == '%'
221 || *ptr == 'O' || *ptr == 'o' ));
227 print_format(&buffer, formstr, va_arg(arg, void *));
241 return (buffer - bstart);