home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
ctcoll95.zip
/
BASTELST
/
PAPI020.ZIP
/
PRINTF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-06
|
3KB
|
197 lines
#include <dos.h>
#include <stdarg.h>
#include <mem.h>
#include "types.h"
static void kprintn(dword, int);
int putchar(char c);
static void cursor(dword pos);
static void sput(byte c);
void
printf(const char *fmt, ...)
{
char *p;
int ch;
dword ul;
int lflag;
va_list ap;
va_start(ap, fmt);
for (;;) {
while ((ch = *fmt++) != '%') {
if (ch == '\0')
return;
putchar(ch);
}
lflag = 0;
reswitch: switch (ch = *fmt++) {
case 'l':
lflag = 1;
goto reswitch;
case 'c':
ch = va_arg(ap, int);
putchar(ch & 0x7f);
break;
case 's':
p = va_arg(ap, char *);
while ((ch = *p++)!= 0)
putchar(ch);
break;
case 'd':
ul = lflag ?
va_arg(ap, long) : va_arg(ap, int);
if ((long)ul < 0) {
putchar('-');
ul = -(long)ul;
}
kprintn(ul, 10);
break;
case 'o':
ul = lflag ?
va_arg(ap, dword) : va_arg(ap, word);
kprintn(ul, 8);
break;
case 'u':
ul = lflag ?
va_arg(ap, dword) : va_arg(ap, word);
kprintn(ul, 10);
break;
case 'x':
ul = lflag ?
va_arg(ap, dword) : va_arg(ap, word);
kprintn(ul, 16);
break;
default:
putchar('%');
if (lflag)
putchar('l');
putchar(ch);
}
}
/* va_end(ap);*/
}
static void
kprintn(dword ul, int base)
{
/* hold a long in base 8 */
char *p, buf[16];
p = buf;
do {
*p++ = (char) "0123456789abcdef"[(word) ul % base];
} while (ul /= base);
do {
putchar(*--p);
} while (p > buf);
}
int
putchar(char c)
{
if (c == '\n')
sput('\r');
sput(c);
return(0);
}
#define COL 80
#define ROW 25
#define CHR 2
#define MONO_BASE 0x3B4
#define MONO_BUF 0xB0000000
#define CGA_BASE 0x3D4
#define CGA_BUF 0xB8000000
static byte att = 0x7 ;
byte far *Crtat = (byte far *)CGA_BUF;
static unsigned int addr_6845 = CGA_BASE;
static void
cursor(dword pos)
{
outportb(addr_6845,14);
outportb(addr_6845+1,(pos >> 8)&0xff);
outportb(addr_6845,15);
outportb(addr_6845+1,pos&0xff);
}
static void
sput(byte c)
{
static byte far *crtat = 0;
unsigned cursorat;
byte *cp;
/* Extract cursor location */
outportb(addr_6845,14);
cursorat = inportb(addr_6845+1)<<8 ;
outportb(addr_6845,15);
cursorat |= inportb(addr_6845+1);
if(cursorat <= COL*ROW) {
crtat = Crtat + cursorat*CHR;
/* att = crtat[1]; /* use current attribute present */
} else crtat = Crtat;
switch (c) {
case '\t':
do
sput(' ');
while ((int)crtat % (8*CHR));
break;
case '\010':
crtat -= CHR;
break;
case '\r':
crtat -= (word) ((crtat - Crtat) % (COL*CHR));
break;
case '\n':
crtat += COL*CHR ;
break;
default:
crtat[0] = c;
crtat[1] = att;
crtat += CHR;
break ;
}
/* implement a scroll */
if (crtat >= Crtat+COL*ROW*CHR) {
/* move text up */
memcpy(Crtat, Crtat+COL*CHR, COL*(ROW-1)*CHR);
/* clear line */
for (cp = Crtat+ COL*(ROW-1)*CHR;
cp < Crtat + COL*ROW*CHR ; cp += 2)
cp[0] = ' ';
crtat -= COL*CHR ;
}
cursor((crtat-Crtat)/CHR);
}
void
init_printf(void)
{
word was;
/* probe to find if a color or monochrome display */
was = *(word *)Crtat;
*(word *)Crtat = 0xA55A;
if (*(word *)Crtat != 0xA55A) {
Crtat = (byte far *) MONO_BUF;
addr_6845 = MONO_BASE;
}
*(word *)Crtat = was;
}