/* aslex.c */

/*
 * (C) Copyright 1989,1990
 * All Rights Reserved
 *
 * Alan R. Baldwin
 * 721 Berkeley St.
 * Kent, Ohio  44240
 */

#include <stdio.h>
#include <setjmp.h>
#include <string.h>
#include <stdlib.h>
#include "asm.h"

VOID getid(char *id, register int c)
{
	register char *p;

	if (c < 0) {
		c = getnb();
		if ((ctype[c] & LETTER) == 0)
			qerr();
	}
	p = id;
	do {
		if (p < &id[NCPS])
			*p++ = c;
	} while (ctype[c=get()] & (LETTER|DIGIT));
	unget(c);
	while (p < &id[NCPS])
		*p++ = 0;
}

char getnb(void)
{
	register char c;

	while ((c=get()) == ' ' || c == '\t')
		;
	return (c);
}

char get(void)
{
	register char c;

	if ((c = *ip) != 0)
		++ip;
	return (c);
}

VOID unget(register int c)
{
	if (c)
		--ip;
}

int getmap(register int d)
{
	register int c, n, v;

	if ((c=get()) == '\0')
		qerr();
	if (c == d)
		return (-1);
	if (c == '\\') {
		c = get();
		switch (c) {

		case 'b':
			c = '\b';
			break;

		case 'f':
			c = '\f';
			break;

		case 'n':
			c = '\n';
			break;

		case 'r':
			c = '\r';
			break;

		case 't':
			c = '\t';
			break;

		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
			n = 0;
			v = 0;
			while (++n<=3 && c>='0' && c<='7') {
				v = (v<<3) + c - '0';
				c = get();
			}
			unget(c);
			c = v;
			break;
		}
	}
	return (c);
}

char *fgetstring(char *s, int n, FILE *stream)
{
register int c, i = 0;

	if(feof(stream))
		return(NULL);
	while(i < n) {
		c = fgetc(stream);
		if(c  == EOF && i == 0)
			return(NULL);
		if(c  == EOF || c  == '\n' || c  == '\r') {
			s[i] = '\0';
			return(s);
		}
		s[i++] = c;
	}
	s[n-1] = '\0';
	return(s);
}

int getline(void)
{
register int i;

loop:	if (incfil >= 0) {
		if (fgetstring(ib, sizeof ib, ifp[incfil]) == NULL) {
			fclose(ifp[incfil--]);
			lop = NLPP;
			goto loop;
		}
	} else
	if (fgetstring(ib, sizeof ib, sfp[cfile]) == NULL) {
		if (++cfile <= inpfil)
			goto loop;
		return (0);
	}
	i = strlen(ib) - 1;
	if (ib[i] == '\n')
		ib[i] = 0;
	return (1);
}

int more(void)
{
	register int c;

	c = getnb();
	unget(c);
	return( (c == '\0' || c == ';') ? 0 : 1 );
}

char endline(void)
{
	register char c;

	c = getnb();
	return((char) ((c == '\0' || c == ';') ? '\0' : c ));
}
