|
|
Power 6/32 Unix version 1.21
char xstr[];
#line 1 "printf.c"
static char *printf_id = (&xstr[8210]);
static char *sccsid = (&xstr[8235]);
#line 1 "/DIST/usr/include/varargs.h"
typedef char *va_list;
#line 6 "printf.c"
static int width, sign, fill;
char *_p_dconv();
printf(va_alist)
int va_alist;
{
va_list ap;
register char *fmt;
char fcode;
int prec;
int length,mask1,nbits,n;
long int mask2, num;
register char *bptr;
char *ptr;
char buf[134];
ap = (char *) &va_alist;
fmt = ((char * *)(ap += sizeof(char *)))[-1];
for (;;) {
while ((fcode = *fmt++)!='%') {
if (fcode=='\0')
return;
putchar(fcode);
}
length = 0;
sign = 0;
if (*fmt == '-') {
sign++;
fmt++;
}
fill = 1;
if (*fmt == '0') {
fill--;
fmt++;
}
if (*fmt == '*') {
width = (( int *)(ap += sizeof( int)))[-1];
if (width < 0) {
width = -width;
sign = !sign;
}
fmt++;
}
else {
width = 0;
while (*fmt>='0' && *fmt<='9')
width = width * 10 + (*fmt++ - '0');
}
if (*fmt=='.') {
if (*++fmt == '*') {
prec = (( int *)(ap += sizeof( int)))[-1];
fmt++;
}
else {
prec = 0;
while (*fmt>='0' && *fmt<='9')
prec = prec * 10 + (*fmt++ - '0');
}
}
else
prec = -1;
switch (*fmt) {
case 'L':
case 'l':
length = 2;
case 'h':
case 'H':
length--;
fmt++;
break;
}
switch (fcode = *fmt++) {
case 'c':
buf[0] = (( int *)(ap += sizeof( int)))[-1];
ptr = bptr = &buf[0];
if (buf[0] != '\0')
ptr++;
break;
case 's':
bptr = ((char * *)(ap += sizeof(char *)))[-1];
if (bptr==0)
bptr = (&xstr[8259]);
if (prec < 0)
prec = 32767 ;
for (n=0; *bptr++ && n < prec; n++) ;
ptr = --bptr;
bptr -= n;
break;
case 'O':
length = 1;
fcode = 'o';
case 'o':
case 'X':
case 'x':
if (length > 0)
num = ((long *)(ap += sizeof(long)))[-1];
else
num = (unsigned) ((int *)(ap += sizeof(int)))[-1];
if (fcode=='o') {
mask1 = 0x7;
mask2 = 0x1fffffffL;
nbits = 3;
}
else {
mask1 = 0xf;
mask2 = 0x0fffffffL;
nbits = 4;
}
n = (num!=0);
bptr = buf + 11 + 3;
do
if (((int) num & mask1) < 10)
*--bptr = ((int) num & mask1) + 060;
else
*--bptr = ((int) num & mask1) + 0127;
while (num = (num >> nbits) & mask2);
if (fcode=='o') {
if (n)
*--bptr = '0';
}
else
if (!sign && fill <= 0) {
putchar('0');
putchar(fcode);
width -= 2;
}
else {
*--bptr = fcode;
*--bptr = '0';
}
ptr = buf + 11 + 3;
break;
case 'D':
case 'U':
case 'I':
length = 1;
fcode = fcode + 'a' - 'A';
case 'd':
case 'i':
case 'u':
if (length > 0)
num = ((long *)(ap += sizeof(long)))[-1];
else {
n = ((int *)(ap += sizeof(int)))[-1];
if (fcode=='u')
num = (unsigned) n;
else
num = (long) n;
}
if (n = (fcode != 'u' && num < 0))
num = -num;
bptr = _p_dconv(num, buf);
if (n)
*--bptr = '-';
if (fill == 0)
fill = -1;
ptr = buf + 10 + 1;
break;
default:
ptr = bptr = &fcode;
ptr++;
break;
}
if (fcode != '\0')
_p_emit(bptr,ptr);
}
;
}
char *
_p_dconv(value, buffer)
long value;
char *buffer;
{
register char *bp;
register int svalue;
int n;
long lval;
bp = buffer;
if (value == 0) {
bp += 10 ;
*bp = '0';
return(bp);
}
n = 0;
while (value < 0) {
value -= 1000000000 ;
n++;
}
while ((lval = value - 1000000000 ) >= 0) {
value = lval;
n++;
}
bp[1] = n + '0';
bp += 10 + 1;
while (value > 32767 ) {
*--bp = (int)(value % 10) + '0';
value /= 10;
}
svalue = value;
while (svalue > 0) {
*--bp = (svalue % 10) + '0';
svalue /= 10;
}
if (buffer[1] != '0') {
while (bp > buffer + 2)
*--bp = '0';
--bp;
}
return(bp);
}
_p_emit(s, send)
register char *s;
char *send;
{
char cfill;
register int alen;
int npad;
alen = send - s;
if (alen > width)
width = alen;
cfill = fill>0? ' ': '0';
if (*s == '-' && fill < 0) {
putchar(*s++);
alen--;
width--;
}
npad = width - alen;
if (!sign)
while (--npad >= 0)
putchar(cfill);
while (--alen >= 0)
putchar(*s++);
if (sign)
while (--npad >= 0)
putchar(cfill);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.