AUSAM/source/mac/mactab/mactab9.c

Compare this file to the similar file:
Show the results in this format:

#include	"../mac/mac.h"
#include	"mactab.h"
#include	"mactab.x"


/*
 *   Misc. routines.
 */


getlin()
{
	register int nchar;
	register cc;

	nchar = 0;
	nline++;
	p = buf;

	while ((cc = getchar()) > 0)  {
		if (nchar > 255)  {
			error("buffer overflow", 0);
			exit(1);
			}

		if (cc == '%' && !nchar)  {
			while ((cc = getchar()) != '\n');
			break;			/* simulate eof */
			}

		buf[nchar++] = cc;
		if (cc == '\n')
			return(nchar);
		}

	buf[0] = '\0';
	return(0);
}

getsym()
{
	register char *s;
	register cc;
	register int i;

	while ((cc = *p++) == ' ' || cc == '\t');

	if (any(cc, alptab) >= 0)  {
		s = clabel;
		*s++ = cc;
		while (any(*p, alptab) >= 0 || any(*p, dectab) >= 0)
			*s++ = *p++;
		*s = '\0';
		if (compar("expr", clabel))  {
			sym = EXP;
			mem = NUL;
			return;
			}

		for (mem=0; mem<nlit; mem++)
			if (compar(literals[mem], clabel))  {
				sym = LIT;
				return;
				}

		sym = LBL;
		mem = NUL;
		return;
		}


	if ((i = any(cc, oprtab)) >= 0)  {
		sym = OPR;
		mem = i;
		return;
		}


	if (cc >= '0' && cc <= '9')  {
		p--;
		sym = CON;
		mem = getnum();
		return;
		}

	if (cc == '\n')  {
		sym = EOL;
		mem = NUL;
		for (i=0; i<4; i++)
			mem4[i] = 0;
		return;
		}

	if (cc == '{')  {
		/* funny EOL symbol - with SELC options */
		s = &mem4[0];
		for (i=0; i<4; i++)
			*s++ = getnum();
		sym = EOL;
		while (*p != '\n')
			p++;
		return;
		}

	if (cc == ',')  {
		sym = DEL;
		mem = cc;
		return;
		}

	if (cc == '"')  {
		i = 0;
		while (*p != '"' && *p != '\n')
			clabel[i++] = *p++;
		clabel[i] = '\0';
		if (*p == '"')
			p++;
		sym = STR;
		mem = NUL;
		return;
		}

	sym = CHR;
	mem = cc;
	return;
}

compar(r, s)
register char *r;
register char *s;
{
	register int n;

	n = 1;
	while (*r == *s)  {
		if (*r == '\0')
			return(1);
		if (n > 8)
			return(0);
		r++;
		s++;
		n++;
		}
	return(0);
}

getnum()
{
	register int i,j;
	register cc;

	while ((cc = *p++) == ' ' || cc == '\t');

	i = 0;
	if (cc == '0')  {

		if (*p == 'x')  {
			p++;
			while ((j = any(*p, hextab)) >= 0)  {
				i = (i<<4) | j;
				p++;
				}
			return(i);
			}

		if (*p == 'b')  {
			p++;
			while (*p == '0' || *p == '1')
				i = (i<<1) | (*p++ - '0');
			return(i);
			}

		while ((j = any(*p, octtab)) >= 0)  {
			i = (i<<3) | j;
			p++;
			}
		return(i);
		}

	i = cc - '0';
	while ((j = any(*p, dectab)) >= 0)  {
		i = i * 10 + j;
		p++;
		}
	return(i);
}

any(cc, str)
register char cc;
char	 str[ ];
{
	register i = 0;

	while (str[i])  {
		if (cc == str[i])
			return(i);
		i++;
		}

	return(ERR);
}

error(s, v)
register char *s;
register int v;
{
	printf("%3d: ", nline);
	printf(s, v);
	putchar('\n');
	nerr++;

	return;
}

copy(r, s)
register char *r;
register char *s;
{
	while ((*s++ = *r++) != '\0');
	return;
}


/*
 *   Comparison for searching.
 *
 *	return  1:  *r > *r,
 *		0:  *r = *s,
 *	       -1:  *r < *s.
 */
cmp(r, s)
register char *r;
register char *s;
{
	register int i;

	/*
	 *   Fast compare.
	 */
	if (*r < *s)
		return(-1);
	if (*s < *r)
		return(1);
	i = 0;
	while (i < 8)  {
		r++;
		s++;

		if (*r < *s)
			return(-1);
		if (*s < *r)
			return(1);
		if (!*r)
			return(0);		/* equal on nul */
		i++;
		}
	return(0);
}