144 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* P R I N T    R O U T I N E S */
 | 
						|
 | 
						|
#include	<system.h>
 | 
						|
#include	<em_arith.h>
 | 
						|
 | 
						|
#define SSIZE	1024	/* string-buffer size for print routines	*/
 | 
						|
 | 
						|
char *long2str();
 | 
						|
 | 
						|
doprnt(fp, fmt, argp)
 | 
						|
	File *fp;
 | 
						|
	char *fmt;
 | 
						|
	int argp[];
 | 
						|
{
 | 
						|
	char buf[SSIZE];
 | 
						|
 | 
						|
	sys_write(fp, buf, format(buf, fmt, (char *)argp));
 | 
						|
}
 | 
						|
 | 
						|
/*VARARGS1*/
 | 
						|
printf(fmt, args)
 | 
						|
	char *fmt;
 | 
						|
	char args;
 | 
						|
{
 | 
						|
	char buf[SSIZE];
 | 
						|
 | 
						|
	sys_write(STDOUT, buf, format(buf, fmt, &args));
 | 
						|
}
 | 
						|
 | 
						|
/*VARARGS1*/
 | 
						|
fprintf(fp, fmt, args)
 | 
						|
	File *fp;
 | 
						|
	char *fmt;
 | 
						|
	char args;
 | 
						|
{
 | 
						|
	char buf[SSIZE];
 | 
						|
 | 
						|
	sys_write(fp, buf, format(buf, fmt, &args));
 | 
						|
}
 | 
						|
 | 
						|
/*VARARGS1*/
 | 
						|
char *
 | 
						|
sprintf(buf, fmt, args)
 | 
						|
	char *buf, *fmt;
 | 
						|
	char args;
 | 
						|
{
 | 
						|
	buf[format(buf, fmt, &args)] = '\0';
 | 
						|
	return buf;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
format(buf, fmt, argp)
 | 
						|
	char *buf, *fmt;
 | 
						|
	char *argp;
 | 
						|
{
 | 
						|
	register char *pf = fmt, *pa = argp;
 | 
						|
	register char *pb = buf;
 | 
						|
 | 
						|
	while (*pf) {
 | 
						|
		if (*pf == '%') {
 | 
						|
			register int width, base, pad, npad;
 | 
						|
			char *arg;
 | 
						|
			char cbuf[2];
 | 
						|
			char *badformat = "<bad format>";
 | 
						|
			
 | 
						|
			/* get padder */
 | 
						|
			if (*++pf == '0') {
 | 
						|
				pad = '0';
 | 
						|
				++pf;
 | 
						|
			}
 | 
						|
			else
 | 
						|
				pad = ' ';
 | 
						|
			
 | 
						|
			/* get width */
 | 
						|
			width = 0;
 | 
						|
			while (*pf >= '0' && *pf <= '9')
 | 
						|
				width = 10 * width + *pf++ - '0';
 | 
						|
			
 | 
						|
			/* get text and move pa */
 | 
						|
			if (*pf == 's') {
 | 
						|
				arg = *(char **)pa;
 | 
						|
				pa += sizeof(char *);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			if (*pf == 'c') {
 | 
						|
				cbuf[0] = * (char *) pa;
 | 
						|
				cbuf[1] = '\0';
 | 
						|
				pa += sizeof(int);
 | 
						|
				arg = &cbuf[0];
 | 
						|
			}
 | 
						|
			else
 | 
						|
			if (*pf == 'l') {
 | 
						|
				/* alignment ??? */
 | 
						|
				if (base = integral(*++pf)) {
 | 
						|
					arg = long2str(*(long *)pa, base);
 | 
						|
					pa += sizeof(long);
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					pf--;
 | 
						|
					arg = badformat;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else
 | 
						|
			if (base = integral(*pf)) {
 | 
						|
				arg = long2str((long)*(int *)pa, base);
 | 
						|
				pa += sizeof(int);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			if (*pf == '%')
 | 
						|
				arg = "%";
 | 
						|
			else
 | 
						|
				arg = badformat;
 | 
						|
 | 
						|
			npad = width - strlen(arg);
 | 
						|
 | 
						|
			while (npad-- > 0)
 | 
						|
				*pb++ = pad;
 | 
						|
			
 | 
						|
			while (*pb++ = *arg++);
 | 
						|
			pb--;
 | 
						|
			pf++;
 | 
						|
		}
 | 
						|
		else
 | 
						|
			*pb++ = *pf++;
 | 
						|
	}
 | 
						|
	return pb - buf;
 | 
						|
}
 | 
						|
 | 
						|
integral(c)
 | 
						|
{
 | 
						|
	switch (c) {
 | 
						|
	case 'b':
 | 
						|
		return -2;
 | 
						|
	case 'd':
 | 
						|
		return 10;
 | 
						|
	case 'o':
 | 
						|
		return -8;
 | 
						|
	case 'u':
 | 
						|
		return -10;
 | 
						|
	case 'x':
 | 
						|
		return -16;
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 |