diff options
Diffstat (limited to 'support/kamal/Match.c')
-rw-r--r-- | support/kamal/Match.c | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/support/kamal/Match.c b/support/kamal/Match.c new file mode 100644 index 0000000000..0498f84aef --- /dev/null +++ b/support/kamal/Match.c @@ -0,0 +1,315 @@ +/* COPYRIGHT (C) 1987 Kamal Al-Yahya */ +#define IN_TM +#include "setups.h" + +Match(fp) /* check matching */ +FILE *fp; +{ + +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); +} |