* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / bcc / dbprintf.c
bloba77a01237ed96762227084c5587bf99e95bbce78
2 #include <sys/types.h>
3 #include <fcntl.h>
5 #if defined(__STDC__) && !defined(__FIRST_ARG_IN_AX__)
6 #include <stdarg.h>
7 #define va_strt va_start
8 #else
9 #include <varargs.h>
10 #define va_strt(p,i) va_start(p)
11 #endif
13 #if defined(__STDC__) && !defined(__FIRST_ARG_IN_AX__)
14 int dbprintf(const char * fmt, ...)
15 #else
16 int dbprintf(fmt, va_alist)
17 __const char *fmt;
18 va_dcl
19 #endif
21 va_list ptr;
22 int rv;
23 va_strt(ptr, fmt);
24 rv = vdbprintf(fmt,ptr);
25 va_end(ptr);
26 return rv;
29 static unsigned char * __numout (long i, int base);
30 static void putch(int ch) { static char buf[2]; *buf = ch; write(2,buf,1); }
32 int
33 vdbprintf(fmt, ap)
34 register __const char *fmt;
35 register va_list ap;
37 int c;
38 int count = 0;
39 int type, base;
40 long val;
41 char * cp;
42 char padch=' ';
43 int minsize, maxsize;
45 while(c=*fmt++)
47 count++;
48 if(c!='%')
49 putch(c);
50 else
52 type=1;
53 padch = *fmt;
54 maxsize=minsize=0;
55 if(padch == '-') fmt++;
57 for(;;)
59 c=*fmt++;
60 if( c<'0' || c>'9' ) break;
61 minsize*=10; minsize+=c-'0';
64 if( c == '.' )
65 for(;;)
67 c=*fmt++;
68 if( c<'0' || c>'9' ) break;
69 maxsize*=10; maxsize+=c-'0';
72 if( padch == '-' ) minsize = -minsize;
73 else
74 if( padch != '0' ) padch=' ';
76 if( c == 0 ) break;
77 if(c=='h')
79 c=*fmt++;
80 type = 0;
82 else if(c=='l')
84 c=*fmt++;
85 type = 2;
88 switch(c)
90 case 'x': base=16; type |= 4; if(0) {
91 case 'o': base= 8; type |= 4; } if(0) {
92 case 'u': base=10; type |= 4; } if(0) {
93 case 'd': base=-10; }
94 switch(type)
96 case 0: /* Promoted: val=va_arg(ap, short); break; */
97 case 1: val=va_arg(ap, int); break;
98 case 2: val=va_arg(ap, long); break;
99 case 4: /* Promoted: val=va_arg(ap, unsigned short); break; */
100 case 5: val=va_arg(ap, unsigned int); break;
101 case 6: val=va_arg(ap, unsigned long); break;
102 default:val=0; break;
104 cp = __numout(val,base);
105 if(0) {
106 case 's':
107 cp=va_arg(ap, char *);
109 count--;
110 c = strlen(cp);
111 if( !maxsize ) maxsize = c;
112 if( minsize > 0 )
114 minsize -= c;
115 while(minsize>0) { putch(padch); count++; minsize--; }
116 minsize=0;
118 if( minsize < 0 ) minsize= -minsize-c;
119 while(*cp && maxsize-->0 )
121 putch(*cp++);
122 count++;
124 while(minsize>0) { putch(' '); count++; minsize--; }
125 break;
126 case 'c':
127 putch(va_arg(ap, int));
128 break;
129 case 'C':
130 c = va_arg(ap, int);
131 if (c>0x7F) {
132 c &=0x7F;
133 putch('M'); putch('-');
135 if (c<' ' || c == '\177') {
136 putch('^'); putch(c^'@');
137 } else
138 putch(c);
139 break;
140 default:
141 putch(c);
142 break;
146 return count;
149 static char nstring[]="0123456789ABCDEF";
151 #ifndef __AS386_16__
152 #define NUMLTH 11
154 static unsigned char *
155 __numout(long i, int base)
157 static unsigned char out[NUMLTH+1];
158 int n;
159 int flg = 0;
160 unsigned long val;
162 if (base<0)
164 base = -base;
165 if (i<0)
167 flg = 1;
168 i = -i;
171 val = i;
173 out[NUMLTH] = '\0';
174 n = NUMLTH-1;
177 out[n--] = nstring[val % base];
178 val /= base;
180 while(val);
181 if(flg) out[n--] = '-';
182 return &out[n+1];
185 #else
187 #asm
188 ! numout.s
190 .bss
191 ___out lcomm $C
193 .text
194 ___numout:
195 push bp
196 mov bp,sp
197 push di
198 push si
199 add sp,*-4
200 mov byte ptr -8[bp],*$0 ! flg = 0
201 mov si,4[bp] ; i or val.lo
202 mov di,6[bp] ; i or val.hi
203 mov cx,8[bp] ; base
204 test cx,cx ! base < 0 ?
205 jge .3num
206 neg cx ! base = -base
207 or di,di ! i < 0 ?
208 jns .5num
209 mov byte ptr -8[bp],*1 ! flg = 1
210 neg di ! i = -i
211 neg si
212 sbb di,0
213 .5num:
214 .3num:
215 mov byte ptr [___out+$B],*$0 ! out[11] = nul
216 mov -6[bp],*$A ! n = 10
218 .9num:
219 !!! out[n--] = nstring[val % base];
220 xor dx,dx
221 xchg ax,di
222 div cx
223 xchg ax,di
224 xchg ax,si
225 div cx
226 xchg ax,si ! val(new) = val / base
228 mov bx,dx ! dx = val % base
230 mov al,_nstring[bx]
231 mov bx,-6[bp]
232 dec word ptr -6[bp]
233 mov ___out[bx],al
235 mov ax,si
236 or ax,di ! while (val)
237 jne .9num
239 cmp byte ptr -8[bp],*$0 ! flg == 0 ?
240 je .Dnum
242 mov bx,-6[bp]
243 dec word ptr -6[bp]
244 mov byte ptr ___out[bx],*$2D ! out[n--] = minus
246 .Dnum:
247 mov ax,-6[bp]
248 add ax,#___out+1
250 add sp,*4
251 pop si
252 pop di
253 pop bp
255 #endasm
257 #endif