File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / ucb / ex / x.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:29:29 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
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);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.