/* COPYRIGHT (C) 1987 Kamal Al-Yahya */ /* subroutines used programs in the package */ #include "setups.h" int begin_to_end(buffer,environment) char *buffer; char *environment; { int c,len,i; char w[MAXWORD]; buffer++; len = 1; while ((c = *buffer++) != NULL) { len++; if (c == '\\') { i = get_buf_word(buffer,w); buffer += i; len += i; if (strcmp(w,"end") == 0) { buffer++; len++; i = get_buf_word(buffer,w); buffer += i+1; len += i+1; if (strcmp(w,environment) == 0) break; } } } return(len); } int command(inbuf,w) char *inbuf; char *w; { int c,i,j; int left_br=0, right_br=0; for (i=0; (c = *inbuf++) != NULL && i < MAXLINE; i++) { w[i] = (char)c; if (c == '{') left_br++; if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } left_br = 0; right_br = 0; for (j=i+1; (c = *inbuf++) != NULL && j < MAXLINE; j++) { w[j] = (char)c; if (c == '{') left_br++; if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } w[++j] = NULL; return(j); } int comm_file(fp,line,match) FILE *fp; int *line,match; { int i=0,lbrl=0; int c; int left_br=0, right_br=0; while ((c = getc(fp)) != EOF) { i++; if (c == '\n') (*line)++; if (c == '{') { left_br++; if (lbrl == 0) lbrl = *line; } if (c == '}') right_br++; if (right_br > left_br) break; } if (match == 1 && c == EOF && left_br > right_br) { fprintf(stderr,"file ends: %d unclosed left braces while reading \\newcommand, first opened at line %d\n",left_br-right_br,lbrl,lbrl); return(i); } left_br = 0; right_br = 0; lbrl = 0; while ((c = getc(fp)) != EOF) { i++; if (c == '\n') (*line)++; if (c == '{') { left_br++; if (lbrl == 0) lbrl = *line; } if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } if (match == 1 && c == EOF && left_br > right_br) fprintf(stderr,"file ends: %d unclosed left braces while reading \\newcommand, first opened at line %d\n",left_br-right_br,lbrl,lbrl); return(i); } int comment(buffer) /* commented text is ignored */ char *buffer; { int c,len=0; while((c = *buffer++) != NULL) { if (c == '\n') break; len++; } return(len); } int def(inbuf,w) char *inbuf, *w; { int c,i; int left_br=0, right_br=0; for (i=0; (c = *inbuf++) != NULL && i < MAXLINE; i++) { w[i] = (char)c; if (c == '{') left_br++; if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } w[++i] = NULL; return(i); } int def_file(fp,line,match) FILE *fp; int *line,match; { int i=0, lbrl=0; int c; int left_br=0, right_br=0; while ((c = getc(fp)) != EOF) { i++; if (c == '\n') (*line)++; if (c == '{') { left_br++; if (lbrl == 0) lbrl = *line; } if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } if (match == 1 && c == EOF && left_br > right_br) fprintf(stderr,"file ends: %d unclosed left braces while reading \\def, first opened at line %d\n",left_br-right_br,lbrl); return(i); } int display(buffer) char *buffer; { int c,len=1; while((c = *buffer++) != NULL) { len++; if(c == '\\') { len++; if ((c = *buffer++) == ']') break; } } return(len); } int dollar(buffer,out_file) char *buffer; FILE *out_file; { int c,len; c=' ' ; /* "erase" the dollar sign */ putc (c,out_file); c = *buffer++; if(c == '$') len=two_dollars(buffer,out_file)+1; else len=one_dollar(buffer); return(len); } int formula(buffer) char *buffer; { int c,len=1; while((c = *buffer++) != NULL) { len++; if (c == '\\') { if ((c = *buffer++) == ')') break; } } return(len); } int get_buf_word(inbuf,w) char *inbuf; char *w; { int c,i; for (i=0; (c = *inbuf++) != NULL && c != ' ' && c != '\n' && c != '\t' && c != '$' && c != '{' && c != '}' && c != '%' && c != '\\' && c != '#' && c != '(' && c != ')' && c != '[' && c != ']' && i < MAXWORD; i++) w[i] = (char)c; if ((c == ' ' || c == '\n' || c == '\t' || c == '$' || c == '{' || c == '}' || c == '%' || c == '\\' && c != '#' || c == '(' || c == ')' || c =='[' || c == ']') && i == 0) w[i++] = (char)c; w[i] = NULL; return(i); } int getenv_file(fp,line,match) FILE *fp; int *line,match; { int i=0,lbrl=0; int c; int left_br=0, right_br=0; while ((c = getc(fp)) != EOF) { i++; if (c == '\n') (*line)++; if (c == '{') { left_br++; if (lbrl == 0) lbrl = *line; } if (c == '}') right_br++; if (right_br > left_br) break; } if (match == 1 && c == EOF && left_br > right_br) { fprintf(stderr,"file ends: %d unclosed left braces while reading \\newenvironment, first opened at line %d\n",left_br-right_br,lbrl); return(i); } left_br = 0; right_br = 0; lbrl = 0; while ((c = getc(fp)) != EOF) { i++; if (c == '\n') (*line)++; if (c == '{') { left_br++; if (lbrl == 0) lbrl = *line; } if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } if (match == 1 && c == EOF && left_br > right_br) { fprintf(stderr,"file ends: %d unclosed left braces while reading \\newenvironment, first opened at line %d\n",left_br-right_br,lbrl); return(i); } left_br = 0; right_br = 0; lbrl = 0; while ((c = getc(fp)) != EOF) { i++; if (c == '\n') (*line)++; if (c == '{') { left_br++; if (lbrl == 0) lbrl = *line; } if (c == '}') right_br++; if (left_br == right_br && left_br != 0) break; } if (match == 1 && c == EOF && left_br > right_br) fprintf(stderr,"file ends: %d unclosed left braces while reading \\newenvironment, first opened at line %d\n",left_br-right_br,lbrl); return(i); } int get_file_word(fp,w,line,c) FILE *fp; char *w; int *line, *c; { int i; for (i=0; (*c = getc(fp)) != NULL && *c != ' ' && *c != '\n' && *c != '\t' && *c != '$' && *c != '{' && *c != '}' && *c != '\\' && *c != '#' && *c != '(' && *c != ')' && *c != '[' && *c != ']' && *c != '%' && i < MAXWORD; i++) w[i] = (char)*c; if (i == 0 && *c == '\n') (*line)++; w[i] = NULL; return(i); } int is_new_env(w,env_count) char *w; int env_count; { int i; for (i=0; i < env_count; i++) { if (strcmp(env[i].env_name,w) == 0) return(i); } return(-1); } int one_dollar(buffer) char *buffer; /* an in-line equation with one dollar signs as delimeters */ { int c,len=0; while((c = *buffer++) != NULL) { len++; if(c == '$') break; } return(len+1); } void scrbuf(in,out) /* copy input to output */ FILE *in,*out; { int c; while ((c =getc(in)) != EOF) putc(c,out); } void tmpbuf(in,buffer) /* copy input to buffer, buffer holds only MAXLEN characters */ FILE *in; char *buffer; { int c; unsigned int l=0; while (l++ < MAXLEN && (c = getc(in)) != EOF) *buffer++ = (char)c; if (l >= MAXLEN) { fprintf(stderr,"Sorry: document is too large\n"); exit(-1); } *buffer = NULL; } int two_dollars(buffer,out_file) char *buffer; FILE *out_file; /* displayed equation with two-dollar sign delimeters */ { int c,len=0; while((c = *buffer++) != NULL) { len++; if(c == '$') { c = *buffer++; len++; if (c != '$') putc(c,out_file); break; } } return(len); }