source: trunk/hal/i386/printk.c @ 27

Last change on this file since 27 was 1, checked in by alain, 8 years ago

First import

File size: 2.0 KB
Line 
1#include <stdarg.h>
2#include "screen.h"
3
4static int strlen (char *s)
5{
6        int i = 0;
7        while (*s++)
8                i++;
9        return i;
10}
11
12
13void itoa(char *buf, unsigned long int n, int base)
14{
15        unsigned long int tmp;
16        int i, j;
17
18        tmp = n;
19        i   = 0;
20
21        do 
22        {
23                tmp = n%base;
24                buf[i++] = (tmp < 10) ? (tmp + '0') : (tmp + 'a' - 10);
25        } while (n /= base);
26       
27        buf[i--] = 0;
28
29        for (j=0; j<i; j++, i--) 
30        {
31                tmp    = buf[j];
32                buf[j] = buf[i];
33                buf[i] = tmp;
34        }
35}
36
37/* Early boot-time printf */
38void printf(char *s, ...)
39{
40        va_list ap;
41
42        char    buf[16];
43        int     i, j, size, buflen, neg;
44
45        unsigned        char c;
46        int             ival;
47        unsigned int    uival;
48
49        va_start(ap, s);
50
51        while ((c = *s++)) 
52        {
53                size = 0;
54                neg  = 0;
55
56                if (c == 0)
57                        break;
58                else if (c == '%') 
59                {
60                        c = *s++;
61                        if (c >= '0' && c <= '9') 
62                        {
63                                size = c - '0';
64                                c = *s++;
65                        }
66
67                        if (c == 'd') 
68                        {
69                                ival = va_arg(ap, int);
70                                if (ival < 0) 
71                                {
72                                        uival = 0 - ival;
73                                        neg++;
74                                }
75                                else
76                                        uival = ival;
77                                itoa(buf, uival, 10);
78
79                                buflen = strlen(buf);
80                                if (buflen < size) 
81                                        for (i=size, j=buflen; i>=0; i--, j--)
82                                                buf[i] = (j>=0) ? buf[j] : '0';
83
84                                if (neg)
85                                        printf("-%s", buf);
86                                else
87                                        printf(buf);
88                        }
89                        else if (c == 'u') 
90                        {
91                                uival = va_arg(ap, int);
92                                itoa(buf, uival, 10);
93
94                                buflen = strlen(buf);
95                                if (buflen < size) 
96                                        for (i=size, j=buflen; i>=0; i--, j--)
97                                                buf[i] = (j>=0) ? buf[j] : '0';
98
99                                printf(buf);
100                        }
101                        else if (c == 'x' || c == 'X') 
102                        {
103                                uival = va_arg(ap, int);
104                                itoa(buf, uival, 16);
105
106                                buflen = strlen(buf);
107                                if (buflen < size) 
108                                        for (i=size, j=buflen; i>=0; i--, j--)
109                                                buf[i] = (j>=0) ? buf[j] : '0';
110
111                                printf("0x%s", buf);
112                        }
113                        else if (c == 'p') 
114                        {
115                                uival = va_arg(ap, int);
116                                itoa(buf, uival, 16);
117                                size = 8;
118
119                                buflen = strlen(buf);
120                                if (buflen < size) 
121                                        for (i=size, j=buflen; i>=0; i--, j--)
122                                                buf[i] = (j>=0) ? buf[j] : '0';
123
124                                printf("0x%s", buf);
125                        }
126                        else if (c == 's') {
127                                printf( (char *) va_arg(ap, int) );
128                        }
129                        else 
130                        {
131                                /* nop */
132                        }
133                }
134                else
135                        putcar(c);
136        }
137
138        return;
139}
140
Note: See TracBrowser for help on using the repository browser.