int line=1; /* line counter */
int ld=0; /* single left dollar signs */
int rd=0; /* single right dollar signs */
int ldd=0; /* left double dollar signs */
int rdd=0; /* right double dollar signs */
int disp=0; /* \[ \] */
int disp_line=1; /* line number of \[ */
int form=0; /* \( \) */
int lform=1; /* line number of \( */
int lp=0; /* left parenthesis */
int rp=0; /* right parenthesis */
int lb=0; /* left brackets */
int rb=0; /* right brackets */
int lbr=0; /* left braces */
int rbr=0; /* right braces */
int c=' '; /* current character */
int c1=' '; /* previous character */
int lbrl=0; /* line number of left braces */
int lbl=0; /* line number of left bracket */
int lpl=0; /* line number of left parenthesis */
int ldl=1; /* line number of left single dollar sign */
int lddl=1; /* line number of left double dollar sign */
int warn=0; /* warning status */
int env_count = 0; /* environment counter */
int i=0, j=0;
char w[MAXWORD];
char *p;
int cc;
extern char *malloc();
while ((c =getc(fp)) != EOF)
{
if (ldd == 1 && ld == 1 && c != '$')
{
fprintf(stderr,"line %d: a double dollar sign is closed by a single dollar sign\n",line);
ld=0.; ldd=0.; /* reset dollar signs */
/* Give warning about unclosed openings */
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces in equation\n",lddl,lbr-rbr);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets in equation\n",lddl,lb-rb);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",lddl,lp-rp);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
switch(c)
{
case '\n':
line++; /* increment line counter */
/* check to see if a single dollar sign is not closed at the same line */
if (ld == 1 && warn == 0)
{
fprintf(stderr,"line %d: single dollar sign is not closed on the same line\n",line-1);
warn=1; /* warning has been given */
}
break;
case '%': /* ignore commented text */
while ((c =getc(fp)) != EOF)
if (c == '\n') {line++; break;}
break;
case '{':
if (lbrl == 0) lbrl=line;
lbr++;
break;
case '}':
rbr++;
if (rbr > lbr)
{
fprintf(stderr,"line %d: unmatched brace\n",line);
rbr--; /* reset counter */
}
if (lbr == rbr) lbrl=0;
break;
case '[':
if (lbl == 0) lbl=line;
lb++;
break;
case ']':
rb++;
if (rb > lb)
{
fprintf(stderr,"line %d: unmatched bracket\n",line);
rb--; /* reset counter */
}
if (lb == rb) lbl=0;
break;
case '(':
if (lpl == 0) lpl=line;
lp++;
break;
case ')':
rp++;
if (rp > lp)
{
fprintf(stderr,"line %d: unmatched parenthesis\n",line);
rp--; /* reset counter */
}
if (lp == rp) lpl=0;
break;
case '$':
if (c1 == '$') /* double dollar sign */
{
if (ld == 0)
{
fprintf(stderr,"line %d: single dollar sign is closed by a duble dollar sign\n",line);
c=' '; /* reset the dollar sign */
break;
}
if (ldd == 1)
{
rdd=1; /* right double dollar sign */
/* Give warning about unclosed openings */
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces in equation\n",lddl,lbr-rbr);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets in equation\n",lddl,lb-rb);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",lddl,lp-rp);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
else
{
ldd=1; /* left double dollar sign */
lddl=line; /* line number */
/* Give warning about unclosed openings */
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces before equation, first opened at line %d\n",lddl,lbr-rbr,lbrl);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets before equation, first opened at line %d\n",lddl,lb-rb,lbl);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses before equation, first opened at line %d\n",lddl,lp-rp,lpl);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
}
if (ld == 1) rd=1; /* right dollar sign */
else
{
ld=1; /* left dollar sign */
ldl=line; /* line number */
warn=0; /* no warning has been given */
}
break;
case '\\':
/* check for \begin{...} and \end{...} */
i = get_file_word(fp,w,&line,&cc);
if (i == 0 && cc == '[')
{
if (disp == 1)
fprintf(stderr,"line %d: displayed equation starts, previous one at line %d not closed\n",line,disp_line);
disp=1; /* left \] */
disp_line=line;
/* Give warning about unclosed openings */
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces before equation\n",line,lbr-rbr);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets before equation\n",line,lb-rb);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses before equation\n",line,lp-rp);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
else if (i == 0 && cc == ']')
{
if (disp == 0)
fprintf(stderr,"line %d: displayed equation ends but no beginning\n",line);
disp=0; /* right \] */
/* Give warning about unclosed openings */
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces in equation\n",line,lbr-rbr);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets in equation\n",line,lb-rb);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",line,lp-rp);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
else if (i == 0 && cc == '(')
{
if (form == 1)
fprintf(stderr,"line %d: formula starts but previous one not closed\n",line);
form=1; /* left \( */
lform=line; /* line of \( */
}
else if (i == 0 && cc == ')')
{
if (form == 0)
fprintf(stderr,"line %d: formula ends but no beginning\n",line);
form=0; /* right \) */
}
else if (strcmp(w,"begin") == 0)
{
int ii=0;
ii=get_file_word(fp,w,&line,&cc);
if ((j=is_new_env(w,env_count)) < 0)
{
j = env_count;
env[j].env_beg = 0;
env[j].env_end = 0;
p = (char *) malloc((unsigned)(ii*sizeof(char)+1));
strcpy(p,w);
env[env_count++].env_name = p;
}
env[j].beg_line = line;
env[j].env_beg++;
/* Give warning about unclosed openings before these environments */
if (strcmp(env[j].env_name,"equation") == 0 ||
strcmp(env[j].env_name,"eqnarray") == 0 ||
strcmp(env[j].env_name,"eqnarray*") == 0 ||
strcmp(env[j].env_name,"displaymath") == 0)
{
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces before environment ``%s'', first opened at line %d\n",line,lbr-rbr,env[j].env_name,lbrl);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets before environment ``%s'', first opened at line %d\n",line,lb-rb,env[j].env_name,lbl);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses before environment ``%s'', first opened at line %d\n",line,lp-rp,env[j].env_name,lpl);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
}
else if (strcmp(w,"end") == 0)
{
(void) get_file_word(fp,w,&line,&cc);
if ((j=is_new_env(w,env_count)) < 0)
fprintf(stderr,"line %d: unmatched end for environment ``%s''\n",line,w);
else
{
env[j].env_end++;
if (env[j].env_end > env[j].env_beg)
{
fprintf(stderr,"line %d: unmatched end for environment ``%s''\n",line,
env[j].env_name);
env[j].env_end--; /* reset */
}
/* Give warning about unclosed openings in these environments */
if (strcmp(env[j].env_name,"equation") == 0 ||
strcmp(env[j].env_name,"eqnarray") == 0 ||
strcmp(env[j].env_name,"eqnarray*") == 0 ||
strcmp(env[j].env_name,"displaymath") == 0)
{
if ((lbr-rbr) > 0)
fprintf(stderr,"line %d: %d unclosed braces in environment ``%s''\n",
line,lbr-rbr,env[j].env_name);
if ((lb-rb) > 0)
fprintf(stderr,"line %d: %d unclosed brackets in environment ``%s''\n",
line,lb-rb,env[j].env_name);
if ((lp-rp) > 0)
fprintf(stderr,"line %d: %d unclosed parentheses in environment ``%s''\n",
line,lp-rp,env[j].env_name);
/* clear registers */
lp=0; lb=0; lbr=0;
rp=0; rb=0; rbr=0;
lpl=0; lbrl=0; lbl=0;
}
}
}
else if (strcmp(w,"def") == 0)
(void) def_file(fp,&line,1);
else if (strcmp(w,"newcommand") == 0)
(void) comm_file(fp,&line,1);
else if (strcmp(w,"newenvironment") == 0)
(void) getenv_file(fp,&line,1);
else if (i > 0) fseek(fp,-1,1);
break;
default:
break;
}
c1=c; /* update previous character */
if (ld == 1 && rd == 1)
{ld=0.; rd=0.;} /* matched dollar signs */
if (ldd == 1 && rdd == 1)
{ldd=0.; rdd=0.;} /* matched double dollar signs */
}
if ((lbr-rbr) > 0)
fprintf(stderr,"file ends: %d unclosed left braces, first opened at line %d \n",lbr-rbr,lbrl);
if ((lb-rb) > 0)
fprintf(stderr,"file ends: %d unclosed left brackets, first opened at line %d\n",lb-rb,lbl);
if ((lp-rp) > 0)
fprintf(stderr,"file ends: %d unclosed left parentheses, first opened at line %d\n",lp-rp,lpl);
if (ld == 1)
fprintf(stderr,"file ends: single dollar sign opened at line %d unclosed\n",ldl);
if (ldd == 1)
fprintf(stderr,"file ends: double dollar sign opened at line %d unclosed\n",lddl);
if (disp == 1)
fprintf(stderr,"file ends: displayed equation opened at line %d unclosed\n",disp_line);
if (form == 1)
fprintf(stderr,"file ends: formula opened at line %d unclosed\n",lform);
for (i=0; i<env_count; i++)
if (env[i].env_beg > env[i].env_end)
fprintf(stderr,"file ends: environment ``%s'' begun at line %d not ended\n",env[i].env_name,env[i].beg_line);
}