|
|
1.1 root 1: /*
2: * printf.c
3: */
4:
5: /*
6: * For indirecting and incrementing argument pointer.
7: */
8: #define ind(p, t) (*((t *) p))
9: #define inc(t1, t2) ((sizeof(t2 *)+sizeof(t1)-1) / sizeof(t1))
10:
11: /*
12: * Table for printing out digits.
13: */
14: char digtab[] ={
15: '0', '1', '2', '3', '4', '5', '6', '7',
16: '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
17: };
18:
19: /*
20: * A simple printf.
21: */
22: printf(fp, a1)
23: register char *fp;
24: {
25: char * cp;
26: register int c;
27: register unsigned *ap;
28: int lflag;
29:
30: ap = (char *)&a1;
31: for (;;) {
32: while ((c=*fp++) != '%') {
33: if (c == '\0')
34: return;
35: putchar(c);
36: }
37:
38: lflag = 0;
39: if ( *fp == 'l' ) {
40: lflag = 1;
41: fp++;
42: }
43:
44: switch ( c = *fp++ ) {
45:
46: case 'c':
47: putchar(*ap++);
48: continue;
49:
50: case 'd':
51: if ( lflag == 0 ) {
52: if ( ((int)(*ap)) < 0 ) {
53: putchar('-');
54: printn( -((long) ((int)(*ap))), 10 );
55: }
56: else
57: printn( ((long)(*ap)), 10 );
58: ap++;
59: continue;
60: }
61: /* fall through */
62: case 'D':
63: if ( *((long *)(ap)) < 0 ) {
64: putchar('-');
65: printn( - *((long *)(ap)), 10 );
66: }
67: else
68: printn( *((long *)(ap)), 10 );
69:
70: ((long *)(ap))++;
71: continue;
72:
73: case 'o':
74: if ( lflag == 0 ) {
75: printn( ((long)(*ap)), 8);
76: ap++;
77: continue;
78: }
79: /* fall through */
80: case 'O':
81: printf( *((long *)(ap)), 8 );
82: ((long *)(ap))++;
83: continue;
84:
85: case 'r':
86: ap = *((int **) ap);
87: fp = ind(ap, char *);
88: ap += inc(int, char *);
89: continue;
90:
91: case 's':
92: cp = ind(ap, char *);
93: ap += inc(int, char *);
94: while ((c=*cp++) != '\0')
95: putchar(c);
96: continue;
97:
98: case 'x':
99: if ( lflag == 0 ) {
100: printn( ((long)(*ap)), 16 );
101: ap++;
102: continue;
103: }
104: /* fall through */
105: case 'X':
106: printn( *((long *)(ap)), 16 );
107: ((long *)(ap))++;
108: continue;
109:
110: case 'u':
111: if ( lflag == 0 ) {
112: printn( ((long)(*ap)), 10);
113: ap++;
114: continue;
115: }
116: /* fall through */
117: case 'U':
118: printn( *((long *)(ap)), 10 );
119: ((long *)(ap))++;
120: continue;
121:
122: case 'p':
123: if (sizeof(char *) > sizeof(int)) {
124: printn( ((long)(*ap)), 16);
125: putchar(':');
126: ap++;
127: }
128: printn( ((long)(*ap)), 16);
129: ap++;
130: continue;
131:
132: default:
133: putchar(c);
134: continue;
135: }
136: }
137: }
138:
139: /*
140: * Print out the unsigned long `v' in the base `b'.
141: */
142: printn( v, b )
143: unsigned long v;
144: {
145: unsigned long n;
146:
147: if (n=v/b)
148: printn(n, b);
149:
150: putchar(digtab[v%b]);
151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.