/* wf.c
L. Stewart October 12, 1982 10:51 AM
November 8, 1982 5:12 PM, added WriteProc
March 10, 1983 2:59 PM, removed WriteProc
*/
#include <Env.h>
extern PutChar();
extern Block();
extern IsDigit();
extern Ugt();
extern UDiv();
extern URem();
wf(fmt)
char *fmt;
{
while (*fmt != 0) PutChar(*fmt++);
};
wfcr()
{
wf("\r");
};
wf1(fmt, a1)
char *fmt;
int a1;
{
pfary(fmt, &a1);
};
wf2(fmt, a1, a2)
char *fmt;
int a1, a2;
{
int ary[2];
ary[0] = a1;
ary[1] = a2;
pfary(fmt, ary);
};
wf3(fmt, a1, a2, a3)
char *fmt;
int a1, a2, a3;
{
int ary[3];
ary[0] = a1;
ary[1] = a2;
ary[2] = a3;
pfary(fmt, ary);
};
wf4(fmt, a1, a2, a3, a4)
char *fmt;
int a1, a2, a3, a4;
{
int ary[4];
ary[0] = a1;
ary[1] = a2;
ary[2] = a3;
ary[3] = a4;
pfary(fmt, ary);
};
static pfary(fmt, ary)
char *fmt;
int *ary;
{
char c;
while ((c = *fmt++) != 0) {
Block();
if (c == '%') fmt = doone(fmt, *ary++);
else PutChar(c);
};
};
static char *doone(fmt, a1)
char *fmt;
int a1;
{
char c, fillchar, *last;
char buf[20];
int width, radix, i;
fillchar = ' ';
buf[0] = 0;
width = 0;
if (*fmt == '0') fillchar = '0';
while ((c = *fmt++) != 0) {
if (IsDigit(c)) width = (width * 10) + (c - '0');
else break;
};
if (c == 'r') { ssw(a1); return(fmt); };
if (c == 's') { wf(a1); return(fmt); };
if (c == 'c') { PutChar(a1); return(fmt); };
if (c == 'd') radix = -10;
if (c == 'u') radix = 10;
if (c == 'x') radix = 16;
if (c == 'o') radix = 8;
if (radix==0) return(fmt);
last = putfnum(buf, a1, radix);
if (width>0) {
width -= (last-buf);
while (width > 0) {
Block();
PutChar(fillchar);
width -= 1;
};
};
wf(buf);
return(fmt);
};
static ssw(s)
struct ShortSTRING *s;
{
int i;
for (i = 0; i < s->length; i += 1) PutChar(s->text[i]);
};
static char *putfnum(buf, a1, radix)
char *buf;
int a1, radix;
{
int digit;
if (radix<0) {
radix = -radix;
if (a1<0) {
a1 = -a1;
*buf++ = '-';
};
};
if (!Ugt(radix, a1)) buf = putfnum(buf, UDiv(a1, radix), radix);
digit = URem(a1, radix);
if (digit>9) *buf++ = digit + 'A'-10;
else *buf++ = digit + '0';
*buf = 0;
return(buf);
};