Mercurial > hg > Members > innparusu > xv6-rpi
comparison src/usr/printf.c @ 21:45035047d186
use stdarg for printf
author | mir3636 |
---|---|
date | Sat, 07 Apr 2018 18:44:18 +0900 |
parents | 83c23a36980d |
children |
comparison
equal
deleted
inserted
replaced
20:33c9000056b5 | 21:45035047d186 |
---|---|
1 #include "types.h" | 1 #include "types.h" |
2 #include "stat.h" | 2 #include "stat.h" |
3 #include "user.h" | 3 #include "user.h" |
4 #include <stdarg.h> | |
4 | 5 |
5 static void | 6 static void |
6 putc(int fd, char c) | 7 putc(int fd, char c) |
7 { | 8 { |
8 write(fd, &c, 1); | 9 write(fd, &c, 1); |
39 void | 40 void |
40 printf(int fd, char *fmt, ...) | 41 printf(int fd, char *fmt, ...) |
41 { | 42 { |
42 char *s; | 43 char *s; |
43 int c, i, state; | 44 int c, i, state; |
44 uint *ap; | 45 va_list ap; |
45 | 46 |
46 state = 0; | 47 state = 0; |
47 ap = (uint*)(void*)&fmt + 1; | 48 va_start(ap, fmt); |
48 for(i = 0; fmt[i]; i++){ | 49 for(i = 0; fmt[i]; i++){ |
49 c = fmt[i] & 0xff; | 50 c = fmt[i] & 0xff; |
50 if(state == 0){ | 51 if(state == 0){ |
51 if(c == '%'){ | 52 if(c == '%'){ |
52 state = '%'; | 53 state = '%'; |
53 } else { | 54 } else { |
54 putc(fd, c); | 55 putc(fd, c); |
55 } | 56 } |
56 } else if(state == '%'){ | 57 } else if(state == '%'){ |
57 if(c == 'd'){ | 58 if(c == 'd'){ |
58 printint(fd, *ap, 10, 1); | 59 printint(fd, va_arg(ap,int), 10, 1); |
59 ap++; | |
60 } else if(c == 'x' || c == 'p'){ | 60 } else if(c == 'x' || c == 'p'){ |
61 printint(fd, *ap, 16, 0); | 61 printint(fd, va_arg(ap,int), 16, 0); |
62 ap++; | |
63 } else if(c == 's'){ | 62 } else if(c == 's'){ |
64 s = (char*)*ap; | 63 s = va_arg(ap,char*); |
65 ap++; | |
66 if(s == 0) | 64 if(s == 0) |
67 s = "(null)"; | 65 s = "(null)"; |
68 while(*s != 0){ | 66 while(*s != 0){ |
69 putc(fd, *s); | 67 putc(fd, *s); |
70 s++; | 68 s++; |
71 } | 69 } |
72 } else if(c == 'c'){ | 70 } else if(c == 'c'){ |
73 putc(fd, *ap); | 71 putc(fd, va_arg(ap,int)); |
74 ap++; | |
75 } else if(c == '%'){ | 72 } else if(c == '%'){ |
76 putc(fd, c); | 73 putc(fd, c); |
77 } else { | 74 } else { |
78 // Unknown % sequence. Print it to draw attention. | 75 // Unknown % sequence. Print it to draw attention. |
79 putc(fd, '%'); | 76 putc(fd, '%'); |
80 putc(fd, c); | 77 putc(fd, c); |
81 } | 78 } |
82 state = 0; | 79 state = 0; |
83 } | 80 } |
84 } | 81 } |
82 va_end(ap); | |
85 } | 83 } |