| struct sw { |
| const void *x; |
| int r; |
| }; |
| struct sq { |
| struct sw *q_w; |
| int t; |
| int z; |
| }; |
| |
| int |
| f (int ch, char *fp, char *ap) |
| { |
| register int n; |
| register char *cp; |
| register struct sw *p; |
| register int f; |
| int prec; |
| double _double; |
| int expt; |
| int ndig; |
| char expstr[7]; |
| unsigned long long _uquad; |
| struct sq q; |
| struct sw w[8]; |
| static char zeroes[16]; |
| |
| for (;;) { |
| switch (ch) { |
| case 'd': |
| _double = (double) (ap += 8, *((double *) (ap - 8))); |
| break; |
| case 'o': |
| goto nosign; |
| case 'u': |
| _uquad = (f & 0x020 ? (ap += 8, *((long long *) (ap - 8))) : f & 0x010 ? (ap += 4, *((long *) (ap - 4))) : f & 0x040 ? (long)(short)(ap += 4, *((int *) (ap - 4))) : (long)(ap += 4, *((int *) (ap - 4)))); |
| goto nosign; |
| case 'x': |
| _uquad = (f & 0x020 ? (ap += 8, *((long long *) (ap - 8))) : f & 0x010 ? (ap += 4, *((long *) (ap - 4))) : f & 0x040 ? (long)(unsigned short)(ap += 4, *((int *) (ap - 4))) : (long)(ap += 4, *((int *) (ap - 4)))); |
| nosign: |
| if (_uquad != 0 || prec != 0); |
| break; |
| default:; |
| } |
| if ((f & 0x100) == 0) { |
| } else { |
| if (ch >= 'f') { |
| if (_double == 0) { |
| if (expt < ndig || (f & 0x001) != 0) { |
| { if ((n = (ndig - 1)) > 0) { while (n > 16) {{ p->x = (zeroes); p->r = 16; q.z += 16; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} n -= 16; }{ p->x = (zeroes); p->r = n; q.z += n; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }}}} |
| } |
| } else if (expt <= 0) { |
| { p->x = ("0"); p->r = 1; q.z += 1; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} |
| { p->x = 0; p->r = 1; q.z += 1; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} |
| { if ((n = (-expt)) > 0) { while (n > 16) {{ p->x = (zeroes); p->r = 16; q.z += 16; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} n -= 16; }{ p->x = (zeroes); p->r = n; q.z += n; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} }} |
| { p->x = cp; p->r = ndig; q.z += ndig; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} |
| } else { |
| { p->x = cp; p->r = expt; q.z += expt; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} |
| cp += expt; |
| { p->x = ("."); p->r = 1; q.z += 1; p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} |
| { p->x = cp; p->r = (ndig-expt); q.z += (ndig-expt); p++; if (++q.t >= 8) { if (g(fp, &q)) goto error; p = w; }} |
| } |
| } |
| } |
| } |
| |
| error:; |
| } |