/*                        Copyright (c) 1988 Bellcore
**                            All Rights Reserved
**       Permission is granted to copy or use this program, EXCEPT that it
**       may not be sold for profit, the copyright notice must be reproduced
**       on copies, and credit should be given to Bellcore where it is due.
**       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
*/


#ifndef lint
static char rcsid[]= "$Header$";
#endif

#include <stdio.h>
#include "misc.h"
#include "token.h"
#include "line.h"

char *_L_al[_L_MAXLINES];  /* storage for lines */
char *_L_bl[_L_MAXLINES];

int   _L_ai[_L_MAXLINES];  /* index from token line number to first token */
int   _L_bi[_L_MAXLINES];

int   _L_ac[_L_MAXLINES];  /* count of tokens on this token line */
int   _L_bc[_L_MAXLINES];

int   _L_arlm;		/* count of real lines in the file */
int   _L_brlm;

int   _L_aclm;		/* count of content lines in the file */
int   _L_bclm;

int   _L_atlm;		/* count of token lines in the file */
int   _L_btlm;

int   _L_aclindex[_L_MAXLINES]; /* mapping from content lines to real lines*/
int   _L_bclindex[_L_MAXLINES]; 

int   _L_atlindex[_L_MAXLINES]; /*mapping from token lines to content lines */
int   _L_btlindex[_L_MAXLINES];


static void
_L_setrline(file,X,str)
int file;
int X;
char *str;
{
	if (file)
	{
		S_savestr(&_L_bl[X],str);
	}
	else
	{
		S_savestr(&_L_al[X],str);
	}
	return;
}
/*
**	returns 1 if we reached the end of file
**	returns 0 if there is more to do
**
**	stores data and sets maximum counts
*/
int L_init_file(int fnumber, char *fname)
{
	extern char *fgets();
	FILE *fp;
	static char buf[Z_LINELEN+2];	/* +2 is to leave room for us to add
						a newline if we need to */
	int ret_val = 1;
	int tmplen;

	if ((fp = fopen(fname,"r")) == (FILE*) NULL)
	{
		(void) sprintf(Z_err_buf, "Cannot open file %s.\n",fname);
		Z_fatal(Z_err_buf);
	}

	/*
	**	clear the line count
	*/
	_L_setrlmx(fnumber,0);

	/*
	**	read in the entire file
	*/
	while (fgets(buf,Z_LINELEN+1,fp) != (char *) NULL)
	{
		tmplen = strlen(buf);
		if (tmplen <= 0)
		{
			(void) sprintf(Z_err_buf,
			  "fatal error -- got 0 length line %d in file %s\n",
				L_getrlmax(fnumber)+1,
				fname);
			Z_fatal(Z_err_buf);
		}
		else if (tmplen > Z_LINELEN)
		{
			(void) sprintf(Z_err_buf,
  "got fatally long line %d in file %s length is %d, must be a bug\n",
				L_getrlmax(fnumber)+1,
				fname,tmplen);
			Z_fatal(Z_err_buf);
		}
		/*
		**	look for newline as last character
		*/
		if ('\n' != buf[tmplen-1])
		{
			/*
			**	did we run out room in the buffer?
			*/
			if (tmplen == Z_LINELEN)
			{
			(void) sprintf(Z_err_buf,
	"line %d too long in file %s, newline added after %d characters\n",
				L_getrlmax(fnumber)+1,
				fname,Z_LINELEN);
			Z_complain(Z_err_buf);
			}
			else
			{
			(void) sprintf(Z_err_buf,
	"didn't find a newline at end of line %d in file %s, added one\n",
				L_getrlmax(fnumber)+1,
				fname);
			Z_complain(Z_err_buf);
			}

			buf[tmplen] = '\n';
			buf[tmplen+1] = '\0';
		}

		_L_setrline(fnumber,L_getrlmax(fnumber),buf);

		if (L_getrlmax(fnumber) >= _L_MAXLINES-1)
		{
			(void) sprintf(Z_err_buf,
	"warning -- ran out of space reading %s, truncated to %d lines\n",
				fname,_L_MAXLINES);
			Z_complain(Z_err_buf);
			ret_val= 0;
			break;
		}
		else
		{
			/*
			**	increment the line count
			*/
			_L_incrlmx(fnumber);
		}

	}

	(void) fclose(fp);
	/*
	**	reset line numbers
	*/
	L_setclmax(fnumber,0);
	L_settlmax(fnumber,0);

	return(ret_val);
}

