/*      >>>>>> start of cc4 <<<<<<<     */
#ifndef TRUE	/* check to see if need include file */
#include <C.DEF>
#endif
keepch(c)
char c;
{
	mline[mptr]=c;
	if (mptr<mpmax) mptr++;
	return c;
	}
preprocess()
{
	int k;
	char c,sname[namesize];
	if (!cmode) return;
	mptr=lptr=0;
	while(!cif && !eof) {
		if (match("#endif")) cif=TRUE;
		else inline();
		}
	if (ch() == '#') match("#endif");
	while(ch()) {
		if (isspace(ch())) {
			keepch(' ');
			while(isspace(ch())) gch();
			}
		else if (ch() == '\\') {
			keepch(ch());
			gch();
			if (!ch()) {
				error("missing escape character");
				break;
				}
			keepch(ch());
			gch();
			}
		else if(ch()=='"') {
			keepch(ch());
			gch();
			while(ch()!='"') {
				if(!ch()) {
				  error("missing quote");
				  break;
				  }
				if (ch() == '\\') keepch(gch());
				keepch(gch());
				}
			gch();
			keepch('"');
			}
		else if(ch()=='\'') {
			keepch('\'');
			gch();
			while(ch()!='\'') {
				if(!ch()) {
				  error("missing apostrophe");
				  break;
				  }
				if (ch()== '\\') keepch(gch());
				keepch(gch());
				}
			gch();
			keepch('\'');
			}
		else if((ch()=='/') && (nch()=='*')) {
			inchar();
			inchar();
			while(!((ch()=='*') && (nch()=='/'))) {
				if(ch()==0)inline();
				else inchar();
				if(eof)break;
				}
			inchar();
			inchar();
			}
		else if(an(ch())) {
			k=0;
			while(an(ch())) {
				if(k<namemax)sname[k++]=ch();
				gch();
				}
			sname[k]=0;
			if(k=findmac(sname))
				while(c=macq[k++])
					keepch(c);
			else {
				k=0;
				while(c=sname[k++])
					keepch(c);
				}
			}
		else keepch(gch());
		}
	keepch(0);
	if(mptr>=mpmax) error("line too long");
	lptr=mptr=0;
	while(line[lptr++]=mline[mptr++]);
	lptr=0;
	}
addmac()
{
	char sname[namesize];
	int k;
	if (symname(sname) == 0) {
		illname();
		kill();
		return;
		}
	k=0;
	while(putmac(sname[k++]));
	while(isspace(ch())) gch();
	while(putmac(gch()));
	if (macptr >= macmax) error("marco table full");
	}
putmac(c)
char c;
{
	macq[macptr]=c;
	if(macptr < macmax) macptr++;
	return c;
	}
findmac(sname)
char *sname;
{
	int k;
	k=0;
	while(k<macptr) {
		if(astreq(sname,macq+k,namemax)) {
			while(macq[k++]);
			return k;
			}
		while(macq[k++]);
		while(macq[k++]);
		}
	return 0;
	}
outbyte(c)
char c;
{
	if (!c) return 0;	/* if null return */
	if (output) {
		if (putc(c,fout) == ERROR) {
			closeout();
			error("Output file error");
			}
		}
	else putch(c);
	return c;
	}
outstr(ptr)
char *ptr;
{
	while(outbyte(*ptr++));
	}
nl()
{
	outbyte('\r');
	outbyte('\n');
	}
tab()
{
	outbyte('\t');
	}
col()
{
	outbyte(':');
	}
error(ptr)
char *ptr;
{
	char buff[80];
	int  j,k;
	strcpy(buff,ptr);
	strcat(buff," \"");
	j=lptr-10;
	if (j<0) j=0;
	k=strlen(buff);
	while(j-15<lptr && line[j]) buff[k++]=line[j++];
	buff[k]=0;
	strcat(buff,"\"");
	error_print(buff);
	return;
	}
error_print(ptr)
char ptr[];
{
	char buff[80];
	int k,j;
	comment();outstr(line);nl();comment();
	k=0;
	while(k<lptr) {
		if(line[k]==9) tab();
			else outbyte(' ');
		++k;
		}
	outbyte('^');
	nl();comment();outstr("******  ");
	outstr(ptr);
	outstr("  ******");
	nl();
	if (input2) {
		strcpy(buff,"Error in include file at line ");
		sdec(buff+strlen(buff),line2);
		}
	else {
		strcpy(buff,"Error at line ");
		sdec(buff+strlen(buff),line1);
		}
	strcat(buff," ");
	strcat(buff,ptr);
	strcat(buff,"\n");
	pl(buff);
	++errcnt;
	 }
ol(ptr)    
char ptr[];
{
	ot(ptr);
	nl();
}
ot(ptr)
char ptr[];
{
	tab();
	outstr(ptr);
	}
streq(str1,str2)
char str1[],str2[];
{
	int k;
	k=0;
	while(str2[k]) {
		if (str1[k]!=str2[k]) return 0;
		k++;
		}
	return k;
	}
astreq(str1,str2,len)
char str1[],str2[];int len;
{
	int k;
	k=0;
	while (k<len) {
		if ((str1[k])!=(str2[k]))break;
		if(!str1[k])break;
		if(!str2[k])break;
		k++;
		}
	if (an(str1[k]))return 0;
	if (an(str2[k]))return 0;
	return k;
	}
match(lit)
char *lit;
{
	int k;
	blanks();
	if (k=streq(line+lptr,lit))
		{lptr=lptr+k;
		return 1;
		}
	return 0;
	}
amatch(lit,len)
char *lit;int len;
 {
	int k;
	blanks();
	if (k=astreq(line+lptr,lit,len)) {
		lptr=lptr+k;
		while(an(ch())) inbyte();
		return 1;
		}
	return 0;
	}
blanks()
{
	while(1) {
		while(ch()==0) {
			inline();
			preprocess();
			if (eof) break;
			}
		if(isspace(ch())) gch();
		else return;
		}
	}
outdec(number)
int number;
{
	char buff[10];
	outstr(sdec(buff,number));
	}
sdec(string,number)
char string[];
int number;
{
	int k,zs,j;
	char c;
	j=zs=0;
	k=10000;
	if (number<0) {
		number=(-number);
		string[j++]='-';
		}
	while (k>=1) {
		c=number/k + '0';
		if (c != '0' || k == 1 || zs) {
			zs=1;
			string[j++]=c; 
			}
		number=number%k;
		k=k/10;
		}
	string[j]=0;
	return string;
	}
/*						*/
/*	to output number as a hex value		*/
/*						*/
/*	written june 28, 1981 by Mike Bernson	*/
/*						*/
outhex(value)
int value;
{
	int  postion;
	char *hex;

	hex="0123456789abcdef";
	for(postion=16; postion >= 0; postion -=4) 
		outbyte(hex[(value>>postion) & 0x0f]);
	outbyte('h');
	} 0x0f]);
	outbyte('h');
	}/* number of case statement in switch */
int label;	/* label for switch t