blob: 95ac43c07ed8391fbad972cb2c099bb3cba943fa [file] [log] [blame]
union {
short I[2];
long int L;
char C[4];
} itolws;
char *errflg;
long int dot;
short dotinc;
long int expvf;
char *
f(fcount,ifp,itype,ptype)
short fcount;
char *ifp;
{
unsigned w;
long int savdot, wx;
char *fp;
char c, modifier, longpr;
union {
double dval;
struct {
int i1;
int i2;
} ival;
} dw;
union {
float fval;
int ival;
} fw;
int gotdot = 0;
while (fcount > 0) {
fp = ifp;
c = *fp;
longpr = ((c >= 'A') & (c <= 'Z') | (c == 'f') | (c == '4') | (c == 'p') | (c == 'i'));
if ((itype == 0) || (*fp == 'a')) {
wx = dot;
w = dot;
} else {
gotdot = 1;
wx = get((int)dot, itype);
if (!longpr) {
w = (itolws.L=(wx), itolws.I[((dot)&3)>>1]);
}
}
if (c == 'F') {
dw.ival.i1 = wx;
if (itype == 0) {
dw.ival.i2 = expvf;
}
}
modifier = *fp++;
switch(modifier) {
case ' ' :
case '\t' :
break;
case 't':
case 'T':
printf("%T",fcount);
return(fp);
case 'r':
case 'R':
printf("%M",fcount);
return(fp);
case 'k':
printf("%k",w);
break;
case 'K':
printf("%K",wx);
break;
case 'a':
psymoff(dot,ptype,":%16t");
dotinc = 0;
break;
case 'p':
psymoff(0,ptype,"%16t");
break;
case 'u':
printf("%-8u",w);
break;
case 'U':
printf("%-16U",wx); break;
case 'c':
case 'C':
if (modifier == 'C') {
printesc((int)(itolws.L=(wx), itolws.C[(dot)&3]));
} else {
printc((char)(itolws.L=(wx), itolws.C[(dot)&3]));
}
dotinc = 1;
break;
case 'b':
printf("%-8x", (itolws.L=(wx), itolws.C[(dot)&3]));
dotinc = 1;
break;
case 'B':
printf("%-8o", (itolws.L=(wx), itolws.C[(dot)&3]));
dotinc = 1;
break;
case 's':
case 'S':
savdot = dot;
dotinc = 1;
while ((c = (itolws.L=(wx), itolws.C[(dot)&3])) && (errflg == 0)) {
dot = inkdot(1);
if (modifier == 'S') {
printesc(c);
} else {
printc(c);
}
endline();
if (!(dot & 3))
wx = get((int)dot, itype);
}
dotinc = dot - savdot + 1;
dot = savdot;
break;
case 'i':
if (gotdot) {
wx = get((int)(dot & ~3), itype);
}
iDasm((int)(wx), (unsigned int)0, (unsigned int)(dot&~3));
printc('\n');
break;
case 'f':
fw.ival = wx;
printf("%-16.9f", fw.fval);
dotinc = 4;
break;
case 'F':
printf("%-32.18F", dw.dval);
dotinc = 8;
break;
}
}
return(fp);
}