AUSAM/source/mac/mac/mac34.c

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

#include	"mac.h"
#include	"mac.x"

/*
 *   Standard linear search for pseudo op.
 */
pscan()
{
	register int i;
	register char *t;

	t = clabel;
	if (*t == 'd' && *(t+1) == 'c' && *(t+2) && !*(t+3))  {

		/*
		 *   Special define constant (dc?)
		 */
		for (i=0; i<4; i++)
			if (*(t+2) == head.dctype[i].f_class)
				return(i);
		return(ERR);
		}

	/*
	 *   Scan remaining pseudo ops.
	 */
	for (i=4; plabel[i]; i++)  {
		if (compar(clabel, plabel[i]))
			return(i);
		}

	return(ERR);
}


/*
 *   Binary search of opcode table.
 */
oscan()
{
	register char *r;			/* pointer to opcodes */
	register int i;
	register int j;
	register int k;

	i = 0;
	j = head.h_ops - 1;
	while (i <= j)  {
		k = (i + j) >> 1;
		r = &opcode[0] + (k * head.h_o_len);
		switch (cmp(clabel, r))  {

			case  1:
				i = k + 1;
				break;

			case  0:
				/*
				 *   found symbolic.
				 */
				return(k);

			case -1:
				j = k - 1;
				break;

			}
		}
	/*
	 *   Not found.
	 */
	return(ERR);
}

/*
 *   Hashed list search for a label in the symbol
 *   table. options exist to define a label, look
 *   up a label (referenced) or check for label in
 *   the table currently.
 */
lscan(name, mode, c1, value, type)
register char	*name;
int	 mode;
register int	c1;
register int	value;
register int	type;
{
	register struct st *q;

	switch (mode)  {

		default:
			printf("internal error mode %d\n", mode);
			return(ERR);

		/*
		 *   Scan symbol table:
		 *	if label is present, return index,
		 *	if not - define a slot in the table,
		 *	mark the symbol as referenced but
		 *	undefined, and return the index.
		 */
		case LKP:
			q = fchar[c1];
			if (!q)  {
				q = dslot(name, value, REFR);
				fchar[c1] = q;
				return(q - symtab);
				}

			/*
			 *   Search list.
			 */
			while (q)  {
				if (compar(name, q->s_name))  {
					q->s_mode =| REFR;
					return(q - symtab);
					}
				q = q->s_next;
				}

			/*
			 *   Not in list.
			 */
			q = dslot(name, value, REFR);
			q->s_next = fchar[c1];
			fchar[c1] = q;
			return(q - symtab);

		/*
		 *   Scan symbol table:
		 *	if symbol is not in table, define
		 *	an entry for it, and return the index.
		 *	if it is present, mark it defined,
		 *	and enter its value (error if previously
		 *	defined) and return its index.
		 */
		case DEF:
			q = fchar[c1];
			if (!q)  {
				q = dslot(name, value, type|DEFN);
				fchar[c1] = q;
				return(q - symtab);
				}
			/*
			 *   Search list - error if dup. found.
			 */
			while (q)  {
				if (compar(name, q->s_name))  {
					if (q->s_mode & DEFN)  {
						synerr("multi def. label");
						return(ERR);
						}
					q->s_mode =| type|DEFN;
					q->s_value =  locn[lcntr].l_value;
					return(q - symtab);
					}
				q = q->s_next;
				}
			/*
			 *   Add label definition.
			 */
			q = dslot(name, value, type|DEFN);
			q->s_next = fchar[c1];
			fchar[c1] = q;
			return(q - symtab);

		}


	/*
	 *   End of scanner.
	 */
}