xref: /xv6-public/printf.c (revision 308a3b88)
128d9ef04Skaashoek #include "types.h"
2d7b3b802Skaashoek #include "stat.h"
3d7b3b802Skaashoek #include "user.h"
428d9ef04Skaashoek 
528d9ef04Skaashoek static void
putc(int fd,char c)628d9ef04Skaashoek putc(int fd, char c)
728d9ef04Skaashoek {
828d9ef04Skaashoek   write(fd, &c, 1);
928d9ef04Skaashoek }
1028d9ef04Skaashoek 
1128d9ef04Skaashoek static void
printint(int fd,int xx,int base,int sgn)1228d9ef04Skaashoek printint(int fd, int xx, int base, int sgn)
1328d9ef04Skaashoek {
14dca5b5caSrsc   static char digits[] = "0123456789ABCDEF";
1528d9ef04Skaashoek   char buf[16];
16dca5b5caSrsc   int i, neg;
1728d9ef04Skaashoek   uint x;
1828d9ef04Skaashoek 
19dca5b5caSrsc   neg = 0;
2028d9ef04Skaashoek   if(sgn && xx < 0){
2128d9ef04Skaashoek     neg = 1;
22dca5b5caSrsc     x = -xx;
2328d9ef04Skaashoek   } else {
2428d9ef04Skaashoek     x = xx;
2528d9ef04Skaashoek   }
2628d9ef04Skaashoek 
27dca5b5caSrsc   i = 0;
2828d9ef04Skaashoek   do{
2928d9ef04Skaashoek     buf[i++] = digits[x % base];
3028d9ef04Skaashoek   }while((x /= base) != 0);
3128d9ef04Skaashoek   if(neg)
3228d9ef04Skaashoek     buf[i++] = '-';
3328d9ef04Skaashoek 
3428d9ef04Skaashoek   while(--i >= 0)
3528d9ef04Skaashoek     putc(fd, buf[i]);
3628d9ef04Skaashoek }
3728d9ef04Skaashoek 
38f5527388Srsc // Print to the given fd. Only understands %d, %x, %p, %s.
3928d9ef04Skaashoek void
printf(int fd,const char * fmt,...)40*308a3b88SFrans Kaashoek printf(int fd, const char *fmt, ...)
4128d9ef04Skaashoek {
42dca5b5caSrsc   char *s;
43dca5b5caSrsc   int c, i, state;
44dca5b5caSrsc   uint *ap;
4528d9ef04Skaashoek 
46dca5b5caSrsc   state = 0;
47dca5b5caSrsc   ap = (uint*)(void*)&fmt + 1;
4828d9ef04Skaashoek   for(i = 0; fmt[i]; i++){
4928d9ef04Skaashoek     c = fmt[i] & 0xff;
5028d9ef04Skaashoek     if(state == 0){
5128d9ef04Skaashoek       if(c == '%'){
5228d9ef04Skaashoek         state = '%';
5328d9ef04Skaashoek       } else {
5428d9ef04Skaashoek         putc(fd, c);
5528d9ef04Skaashoek       }
5628d9ef04Skaashoek     } else if(state == '%'){
5728d9ef04Skaashoek       if(c == 'd'){
5828d9ef04Skaashoek         printint(fd, *ap, 10, 1);
5928d9ef04Skaashoek         ap++;
6028d9ef04Skaashoek       } else if(c == 'x' || c == 'p'){
6128d9ef04Skaashoek         printint(fd, *ap, 16, 0);
6228d9ef04Skaashoek         ap++;
6328d9ef04Skaashoek       } else if(c == 's'){
64dca5b5caSrsc         s = (char*)*ap;
6528d9ef04Skaashoek         ap++;
66b9432848Srsc         if(s == 0)
67b9432848Srsc           s = "(null)";
6828d9ef04Skaashoek         while(*s != 0){
6928d9ef04Skaashoek           putc(fd, *s);
7028d9ef04Skaashoek           s++;
7128d9ef04Skaashoek         }
72d7b3b802Skaashoek       } else if(c == 'c'){
73d7b3b802Skaashoek         putc(fd, *ap);
74d7b3b802Skaashoek         ap++;
7528d9ef04Skaashoek       } else if(c == '%'){
7628d9ef04Skaashoek         putc(fd, c);
7728d9ef04Skaashoek       } else {
7828d9ef04Skaashoek         // Unknown % sequence.  Print it to draw attention.
7928d9ef04Skaashoek         putc(fd, '%');
8028d9ef04Skaashoek         putc(fd, c);
8128d9ef04Skaashoek       }
8228d9ef04Skaashoek       state = 0;
8328d9ef04Skaashoek     }
8428d9ef04Skaashoek   }
8528d9ef04Skaashoek }
86