blob: 2003fd719defa0fbd81c737c0642795d03e88339 [file] [log] [blame]
/* 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);
}