⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 output.c

📁 window下的c编译器。
💻 C
字号:
#include "c.h"
#include <time.h>

int outfd = 1;
int errfd = 2;
#define ASMBUFSIZ 1024*32
static char buf1[ASMBUFSIZ], buf2[512];	/* output buffers */
static struct io {
	int fd;				/* file descriptor */
	char *bp;			/* buffer pointer */
	char *buffer;			/* buffer proper */
	char *limit;			/* high water limit */
} Iob[] = {
	0, 0, 0, 0,
	1, buf1, buf1, buf1 + sizeof buf1 - 80,
	2, buf2, buf2, buf2 + sizeof buf2 - 80
}, *io[] = {
	&Iob[0],			/* used by stringf */
	&Iob[1],			/* output */
	&Iob[2]				/* standard error & other files; used by fprint */
};
static int fd = 1;			/* current output file */

char *bp = buf1;			/* current output buffer pointer */

void outs(char *s)
{
	char *p;

	for (p = bp; (*p = *s++) != 0; p++)
		;
	bp = p;
	if (bp > io[fd]->limit)
		outflush();
}
void print (char *fmt, ...) {
	va_list ap;

	va_init(ap, fmt);
	vprint(fmt, ap);
	va_end(ap);
}
/* outputInit - initialize output system */
void outputInit() {
	io[1]->fd = outfd;
	io[2]->fd = errfd;
}

/* fprint - formatted output to file descriptor f */
void fprint (int f, char *fmt, ...)
{
	va_list ap;

	va_init(ap, fmt);
	vfprint(f, fmt, ap);
	va_end(ap);
}
extern int GenerateAsm,outfd;
extern clock_t AsmTime;
#ifdef PEEPHOLE
int SendToOptimizer(void)
{
	struct io *iop = io[fd];
	int l;
	bp--;
	if (*bp != '\n') {
		bp++;
		*bp = '\n';
	}
	else *bp++;
	l = ChangeBlock(iop->buffer,bp - iop->buffer);
	bp = iop->buffer + l;
	outflush();
	return(0);
}
#endif
extern FILE *AssemblerFile;
/* outflush - flush output buffer */
void outflush()
{
	struct io *iop = io[fd];
	int l;
	extern int inFunctionCode;

	assert(fd);
	l = bp - iop->buffer;
	if (l && fd == 1) {
		if (GenerateAsm) {
			fwrite(iop->buffer,1,l,AssemblerFile);
		}
		iop->buffer[l] = 0;
		AsmReadBuffer(iop->buffer,l);
		if (IntermediateLanguageFile)
			memset(iop->buffer,0,ASMBUFSIZ);
	}
	else if (bp != iop->buffer) {
#if 0
		if (iop->fd == 2) {
			write(errfd,iop->buffer,l);
		}
		else
#endif
		write(iop->fd,iop->buffer,l);
		if (iop->fd != 2) {
			iop->buffer[l] = 0;
			fprintf(stderr,"%s",iop->buffer);
		}
	}
	bp = iop->bp = iop->buffer;
}

/* stringf - formatted output to a saved string */
char *stringf (char *fmt, ...) {
	char buf[1024];
	va_list ap;

	va_init(ap, fmt);
	fd = 0;
	io[1]->bp = bp;
	bp = io[0]->bp = io[0]->buffer = buf;
	io[0]->limit = buf + sizeof buf;
	vprint(fmt, ap);
	*bp = 0;
	bp = io[1]->bp;
	fd = 1;
	va_end(ap);
	return string(buf);
}

/* vfprint - formatted output to file descriptor f */
void vfprint(int f,char *fmt,va_list ap)
{
	if (f == 1)
		vprint(fmt, ap);
	else {
		fd = 2;
		io[1]->bp = bp;
		io[2]->fd = f == 2 ? errfd : f;
		bp = io[2]->bp;
		vprint(fmt, ap);
		outflush();
		bp = io[1]->bp;
		fd = 1;
	}
}

/* vprint - formatted output to standard output */
void vprint(char *fmt,va_list ap)
{
	for (; *fmt; fmt++)
		if (*fmt == '%')
			switch (*++fmt) {
			case 'c': { *bp++ = va_arg(ap, int);
 } break;
			case 'd': { int n = va_arg(ap, int);
					unsigned m;
					char buf[25], *s = buf + sizeof buf;
					*--s = 0;
					if (n == INT_MIN)
						m = (unsigned)INT_MAX + 1;
					else if (n < 0)
						m = -n;
					else
						m = n;
					do
						*--s = m%10 + '0';
					while ((m /= 10) != 0);
					if (n < 0)
						*--s = '-';
					outs(s);
 } break;
			case 'o': { unsigned n = va_arg(ap, unsigned);
					char buf[25], *s = buf + sizeof buf;
					*--s = 0;
					do
						*--s = (n&7) + '0';
					while ((n >>= 3) != 0);
					outs(s);
 } break;
			case 'x': { unsigned n = va_arg(ap, unsigned);
					char buf[25], *s = buf + sizeof buf;
					*--s = 0;
					do
						*--s = "0123456789abcdef"[n&0xf];
					while ((n >>= 4) != 0);
					outs(s);
 } break;
			case 's': { char *s = va_arg(ap, char *);
					if (s)
						outs(s);
 } break;
			case 'S': { char *s = va_arg(ap, char *);
					int n = va_arg(ap, int);
					if (s)
						while (n-- > 0)
							*bp++ = *s++;
 } break;
			case 'k': { int t = va_arg(ap, int);
					static char *tokens[] = {
#define xx(a,b,c,d,e,f,g) g,
#define yy(a,b,c,d,e,f,g) g,
#include "token.h"
					};
					assert(tokens[t&0177]);
					outs(tokens[t&0177]);
 } break;
			case 't': { Type ty = va_arg(ap, Type);
					outtype(ty ? ty : voidtype);
 } break;
			case 'w': { Coordinate *p = va_arg(ap, Coordinate *);
					if (p->file && *p->file)
						print("%s ", p->file);
					print("%d", p->y); } break;
			default:  *bp++ = *fmt; break;
			}
		else if ((*bp++ = *fmt) == '\n' && bp > io[fd]->limit)
			outflush();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -