/* 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: line.c,v 1.1 88/09/15 11:34:00 daniel Rel $"; #endif #include #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 */ L_init_file(fnumber,fname) 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); }