/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
/* $Id$ */
/* PREPROCESSOR: INPUT SKIP FUNCTIONS */

#include "arith.h"
#include "LLlex.h"
#include "class.h"
#include "input.h"
#include "domacro.h"
#include "error.h"

extern int InputLevel;

int skipspaces(register int ch, int skipnl)
{
	register int nlseen = 0;

	for (;;)
	{
		while (class(ch) == STSKIP)
			ch = GetChar();
		if (skipnl && class(ch) == STNL)
		{
			ch = GetChar();
			LineNumber++;
			nlseen++;
			continue;
		}
		if (ch == TOKSEP && InputLevel)
		{
			ch = GetChar();
			continue;
		}

		/* \\\n are handled by trigraph */

		if (ch == '/')
		{
			ch = GetChar();
			if (ch == '*' && !InputLevel)
			{
				skipcomment();
				ch = GetChar();
			}
			else if (ch == '/' && !InputLevel)
			{
				skiplinecomment();
				ch = GetChar();
			}
			else
			{
				UnGetChar();
				return '/';
			}
		}
		else if (nlseen && ch == '#')
		{
			domacro();
			ch = GetChar();
		}
		else
			return ch;
	}
	/* garbage */
	return 0;
}

int SkipToNewLine(void)
{
	register int ch;
	register int garbage = 0;
	register int delim = 0;

	while ((ch = GetChar()) != '\n')
	{
		if (delim)
		{
			if (ch == '\\')
			{
				if (GetChar() == '\n')
					break;
			}
			else if (ch == delim)
			{
				delim = 0;
			}
			continue;
		}
		else if (ch == '\'' || ch == '\"')
		{
			delim = ch;
			garbage = 1;
		}
		else if (ch == '/')
		{
			if (!InputLevel)
			{
				int nch = GetChar();
				if (nch == '*')
				{
					skipcomment();
					continue;
				}
				else if (nch == '/')
				{
					skiplinecomment();
					continue;
				}
				else
					UnGetChar();
			}
		}
		else if (ch == TOKSEP && InputLevel)
		{
			continue;
		}
		if (!is_wsp(ch))
			garbage = 1;
	}
	if (delim)
		strict("unclosed opening %c", delim);
	++LineNumber;
	return garbage;
}