summaryrefslogtreecommitdiff
path: root/support/kamal/Match.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/kamal/Match.c')
-rw-r--r--support/kamal/Match.c315
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);
+}