00001 #include "types.h"
00002 #include "stat.h"
00003 #include "user.h"
00004
00005 static void
00006 putc(int fd, char c)
00007 {
00008 write(fd, &c, 1);
00009 }
00010
00011 static void
00012 printint(int fd, int xx, int base, int sgn)
00013 {
00014 static char digits[] = "0123456789ABCDEF";
00015 char buf[16];
00016 int i, neg;
00017 uint x;
00018
00019 neg = 0;
00020 if(sgn && xx < 0){
00021 neg = 1;
00022 x = -xx;
00023 } else {
00024 x = xx;
00025 }
00026
00027 i = 0;
00028 do{
00029 buf[i++] = digits[x % base];
00030 }while((x /= base) != 0);
00031 if(neg)
00032 buf[i++] = '-';
00033
00034 while(--i >= 0)
00035 putc(fd, buf[i]);
00036 }
00037
00038
00039 void
00040 printf(int fd, char *fmt, ...)
00041 {
00042 char *s;
00043 int c, i, state;
00044 uint *ap;
00045
00046 state = 0;
00047 ap = (uint*)(void*)&fmt + 1;
00048 for(i = 0; fmt[i]; i++){
00049 c = fmt[i] & 0xff;
00050 if(state == 0){
00051 if(c == '%'){
00052 state = '%';
00053 } else {
00054 putc(fd, c);
00055 }
00056 } else if(state == '%'){
00057 if(c == 'd'){
00058 printint(fd, *ap, 10, 1);
00059 ap++;
00060 } else if(c == 'x' || c == 'p'){
00061 printint(fd, *ap, 16, 0);
00062 ap++;
00063 } else if(c == 's'){
00064 s = (char*)*ap;
00065 ap++;
00066 if(s == 0)
00067 s = "(null)";
00068 while(*s != 0){
00069 putc(fd, *s);
00070 s++;
00071 }
00072 } else if(c == 'c'){
00073 putc(fd, *ap);
00074 ap++;
00075 } else if(c == '%'){
00076 putc(fd, c);
00077 } else {
00078
00079 putc(fd, '%');
00080 putc(fd, c);
00081 }
00082 state = 0;
00083 }
00084 }
00085 }