[mod.sources] v07i029: A collection of tools for TeX users, Part02/02

sources-request@mirror.UUCP (09/15/86)

Submitted by: Kamal Al-Yahya <kamal@hanauma.Stanford.EDU>
Mod.sources: Volume 7, Issue 29
Archive-name: textools/Part02

#!/bin/sh
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
# If all goes well, you will see the message "No problems found."
# Wrapped by mirror!rs on Mon Sep 15 00:28:18 EDT 1986

# Exit status; set to 1 on "wc" errors or if would overwrite.
STATUS=0
# Contents:  texexpand1.c texexpand2.c texmatch.1 texmatch1.c
#	texmatch2.c trmatch.1 trmatch.c MANIFEST
 
echo x - texexpand1.c
if test -f texexpand1.c ; then
    echo texexpand1.c exists, putting output in $$texexpand1.c
    OUT=$$texexpand1.c
    STATUS=1
else
    OUT=texexpand1.c
fi
sed 's/^X//' > $OUT <<'@//E*O*F texexpand1.c//'
X/* texexpand: to expand TeX and LaTeX \input and include files
X * to compile:   cc texexpand.c -o texexpand 
X */

Xchar *documentation[] = {
X" SYNTAX",
X"        texexpand [-w] file1 [file2 .....]",
X"     or texexpand [-w] < file1 [file2 ....]",
X"",
X"        Flags:",
X"              -w    maching is not checked",
X"",
X"See the manual page for more details.",
X"",
X};

X/* Author: Kamal Al-Yahya, Stanford University,		11/1/83 */
X/* Modified:						6/30/86 */

Xint	doclength = { sizeof documentation/sizeof documentation[0] };

X#include        <stdio.h>
X#include        <sys/ioctl.h>
X#include        <sgtty.h>
X#define MAXLEN	100000			/* maximum character in a document */

Xstruct sgttyb ttystat;
Xextern char *strcpy(), *mktemp();
Xchar scratch_file[100];

Xint wflag;
Xint xargc;
Xchar **xargv;

Xmain(argc,argv)
Xint argc; 
Xchar *argv[];
X{
Xchar big[MAXLEN];
XFILE *temp,*scr;
Xregister char *cptr;
Xint piped_in;
Xint i,w;

X/* If no arguments, and not in a pipeline, self document */
Xpiped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
Xif (argc == 1 && !piped_in)
X	{
X	for( i=0; i<doclength; i++)
X		printf("%s\n",documentation[i]);
X	exit (0);
X	}

X/* process option flags */
Xxargc = argc;
Xxargv = argv;
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' )
X		{
X		while( *(++cptr))
X			{
X			switch( *cptr )
X				{
X				case 'w':
X					wflag=1;
X					break;
X				default:
X			     		fprintf(stderr,
X					"unknown flag -%c\n",*cptr);
X					break;
X				}
X			}
X		}
X	}

X/* first process pipe input */
Xif(piped_in)
X	{
X	if (wflag != 1)
X		{
X/* need to buffer; can's seek in pipes */
X/* make a temporary and volatile file in /tmp */
X		strcpy(scratch_file,"/tmp/texXXXXXX");
X		mktemp(scratch_file);
X		scr=fopen(scratch_file,"w");
X		scrbuf(stdin,scr);
X		fclose(scr);
X		scr=fopen(scratch_file,"r");
X		unlink(scratch_file);
X		fprintf(stderr,"Checking matching...\n");
X		TeXMatch(scr);
X		fseek(scr,0,0);
X		TeXExpand(scr,big,MAXLEN);
X		fprintf(stderr,"Checking matching done\n\n");
X		fclose(scr);
X		}
X	else
X		TeXExpand(stdin,big,MAXLEN);

X	fprintf(stdout,"%s\n",big);
X	}

X/* then process input line for arguments and assume they are input files */
Xxargc = argc;
Xxargv = argv;
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if((temp=fopen(cptr,"r")) != NULL)
X		{
X		if (wflag != 1)
X			{
X			fprintf(stderr,"Checking matching...\n");
X			fprintf(stderr,"%s:\n",cptr);
X			TeXMatch(temp);
X			fprintf(stderr,"\n");
X			fseek(temp,0,0);
X			}
X		TeXExpand(temp,big,MAXLEN);
X		if (wflag != 1)
X			fprintf(stderr,"Checking matching done\n\n");
X		fprintf(stdout,"%s",big);
X		fclose(temp);
X		}
X	else
X		fprintf(stderr,"texexpand: Cannot open %s\n",cptr);
X	}

X}
@//E*O*F texexpand1.c//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - texexpand2.c
if test -f texexpand2.c ; then
    echo texexpand2.c exists, putting output in $$texexpand2.c
    OUT=$$texexpand2.c
    STATUS=1
else
    OUT=texexpand2.c
fi
sed 's/^X//' > $OUT <<'@//E*O*F texexpand2.c//'
X/* texexpand: to expand TeX and LaTeX \input and include files
X * to compile:   cc texexpand.c -o texexpand 
X */

Xchar *documentation[] = {
X" SYNTAX",
X"        texexpand [-w] [parameters] [inputfiles]",
X"",
X"        flags:",
X"              -w   does not check matching",
X"",
X"        parameters:",
X"              in=filename       filename is the input file",
X"                                (Default: in=stdin)",
X"",
X"              out=filename      filename is the output file",
X"                                (Default: out=stdout)",
X""
X};

X/* Author: Kamal Al-Yahya, Stanford University,		11/1/83 */
X/* Modified:						6/30/86 */

Xint	doclength = { sizeof documentation/sizeof documentation[0] };

X#include        <stdio.h>
X#include        <sys/ioctl.h>
X#include        <sgtty.h>
X#define MAXLEN	100000			/* maximum character in a document */

Xchar string[100],filename[100];
Xstruct sgttyb ttystat;
Xextern char *strcpy(), *mktemp();
Xchar scratch_file[100];
XFILE *out_file;

Xint wflag;
Xint xargc;
Xchar **xargv;

Xmain(argc,argv)
Xint argc; 
Xchar *argv[];
X{
Xchar big[MAXLEN];
XFILE *temp,*scr;
Xregister char *cptr;
Xint piped_in;
Xint i,w;

X/* If no arguments, and not in a pipeline, self document */
Xpiped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
Xif (argc == 1 && !piped_in)
X	{
X	for( i=0; i<doclength; i++)
X		printf("%s\n",documentation[i]);
X	exit (0);
X	}

Xout_file=stdout;			/* default standard output */

X/* process option flags */
Xxargc = argc;
Xxargv = argv;
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' )
X		{
X		while( *(++cptr))
X			{
X			switch( *cptr )
X				{
X				case 'w':
X					wflag=1;
X					break;
X				default:
X			     		fprintf(stderr,
X					"unknown flag -%c\n",*cptr);
X					break;
X				}
X			}
X		}
X	}

X/* process getpar parameters */
Xxargc = argc;
Xxargv = argv;

Xif(getpar_("out","s",string))
X	{
X	sscanf(string,"%s",filename);
X	if((temp=fopen(filename,"w")) == NULL)
X		fprintf(stderr,"texexpand: Cannot open output file %s\n",filename);
X	else
X		out_file = temp;
X	}


X/* first process pipe input */
Xif(piped_in)
X	{
X	if (wflag != 1)
X		{
X/* need to buffer; can's seek in pipes */
X/* make a temporary and volatile file in /tmp */
X		strcpy(scratch_file,"/tmp/texXXXXXX");
X		mktemp(scratch_file);
X		scr=fopen(scratch_file,"w");
X		scrbuf(stdin,scr);
X		fclose(scr);
X		scr=fopen(scratch_file,"r");
X		unlink(scratch_file);
X		fprintf(stderr,"Checking matching...\n");
X		TeXMatch(scr);
X		fseek(scr,0,0);
X		TeXExpand(scr,big,MAXLEN);
X		fprintf(stderr,"Checking matching done\n\n");
X		fclose(scr);
X		}
X	else
X		TeXExpand(stdin,big,MAXLEN);

X	fprintf(stdout,"%s\n",big);
X	}

X/* next process in=inputfiles */
Xif(getpar_("in","s",string))
X	{
X	sscanf(string,"%s",filename);
X	if((temp=fopen(filename,"r")) != NULL)
X		{
X		if (wflag != 1)
X			{
X			fprintf(stderr,"Checking matching...\n");
X			fprintf(stderr,"%s:\n",cptr);
X			TeXMatch(temp);
X			fprintf(stderr,"\n");
X			fseek(temp,0,0);
X			}
X		TeXExpand(temp,big,MAXLEN);
X		if (wflag != 1)
X			fprintf(stderr,"Checking matching done\n\n");
X		fprintf(stdout,"%s",big);
X		fclose(temp);
X		}
X		else
X			fprintf(stderr,"texexpand: Cannot open %s\n",filename);
X	}

X/* then process input line for arguments and assume they are input files */
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' ) continue;	/* this is a flag */
X	while (*cptr)
X		{
X		if (*cptr == '=')  break; /* this is for getpar */
X		cptr++;
X		}       
X	if (*cptr)  continue;
X	cptr = *xargv;
X	if((temp=fopen(cptr,"r")) != NULL)
X		{
X		if (wflag != 1)
X			{
X			fprintf(stderr,"Checking matching...\n");
X			fprintf(stderr,"%s:\n",cptr);
X			TeXMatch(temp);
X			fprintf(stderr,"\n");
X			fseek(temp,0,0);
X			}
X		TeXExpand(temp,big,MAXLEN);
X		if (wflag != 1)
X			fprintf(stderr,"Checking matching done\n\n");
X		fprintf(stdout,"%s",big);
X		fclose(temp);
X		}
X	else
X		fprintf(stderr,"texexpand: Cannot open %s\n",cptr);
X	}

X}
@//E*O*F texexpand2.c//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - texmatch.1
if test -f texmatch.1 ; then
    echo texmatch.1 exists, putting output in $$texmatch.1
    OUT=$$texmatch.1
    STATUS=1
else
    OUT=texmatch.1
fi
sed 's/^X//' > $OUT <<'@//E*O*F texmatch.1//'
X.TH texmatch 1 7/10/86
X.UC 4
X.SH NAME
Xtexmatch \- checks matching in TeX and LaTeX documents.
X.SH SYNOPSIS
X.B texmatch [-i]
X.I filename
X.SH DESCRIPTION
X.I Texmatch
Xgives error messages if it detects unmatched
Xbraces, brackets, parentheses, and equations in TeX and LaTeX documents.
XError messages are sent
Xto the standard error.
X.br
XEscaped braces, brackets, parentheses, and dollar signs are not
Xcounted. It understands TeX's rules of escaping and dollar signs
Xpairing as well as LaTeX's \\begin{equation} and \\end{equation}.
XIt also checks \\input and \\include files unless the
X.B -i
Xflag is used.
X.br
XText and displayed equations are checked separately.
X.br
XCommented text is not checked.
X.SH DIAGNOSTICS
XDisplayed equations that are started and ended by user-defined
Xcontrol sequences are regarded as text and they are not checked
Xseparately.
X.br
XDoes not check for matching \\begin and \\end in LaTeX environments
Xother than equations.
X.SH SEE ALSO
Xtexexpand(1), texeqn(1).
X.SH AUTHOR
XKamal Al-Yahya, Stanford University
@//E*O*F texmatch.1//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - texmatch1.c
if test -f texmatch1.c ; then
    echo texmatch1.c exists, putting output in $$texmatch1.c
    OUT=$$texmatch1.c
    STATUS=1
else
    OUT=texmatch1.c
fi
sed 's/^X//' > $OUT <<'@//E*O*F texmatch1.c//'
X/*
X * texmatch: checks matching parantheses, braces, brackets, and dollar signs
X * in TeX documents.
X *
X * to compile:  cc texmatch.c -lsep -o texmatch
X */

Xchar *documentation[] = {
X" SYNTAX",
X"        texmatch [-i] file1 [file2 .....]",
X"     or texmatch [-i]  < file1 [file2 ....]",
X"",
X"See the manual page for more details.",
X"",
X};

X/* Author: Kamal Al-Yahya, Stanford University,		11/1/83 */
X/* Modified:						6/30/86 */

Xint	doclength = { sizeof documentation/sizeof documentation[0] };

X#include        <stdio.h>
X#include        <sys/ioctl.h>
X#include        <sgtty.h>
X#define	MAXLEN	100000		/* maximum characters in a document */

Xstruct sgttyb ttystat;
Xextern char *strcpy(), *mktemp();
Xchar scratch_file[100];

Xint wflag=0;		/* for consistency with other programs */
Xint xargc;
Xchar **xargv;

Xmain(argc,argv)
Xint argc; 
Xchar *argv[];
X{
Xchar big[MAXLEN];
XFILE *temp,*scr;
Xregister char *cptr;
Xint piped_in;
Xint i,iflag;

X/* If no arguments, and not in a pipeline, self document */
Xpiped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
Xif (argc == 1 && !piped_in)
X	{
X	for( i=0; i<doclength; i++)
X		printf("%s\n",documentation[i]);
X	exit (0);
X	}

X/* process option flags */
Xxargc = argc;
Xxargv = argv;
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' )
X		{
X		while( *(++cptr))
X			{
X			switch( *cptr )
X				{
X				case 'i':
X					iflag=1;
X					break;
X				default:
X			     		fprintf(stderr,
X					"unknown flag -%c\n",*cptr);
X					break;
X				}
X			}
X		}
X	}

X/* first process pipe input */
Xif(piped_in)
X	{
X	if (iflag != 1)
X		{
X/* need to buffer; can's seek in pipes */
X/* make a temporary and volatile file in /tmp */
X		strcpy(scratch_file,"/tmp/texXXXXXX");
X		mktemp(scratch_file);
X		scr=fopen(scratch_file,"w");
X		scrbuf(stdin,scr);
X		fclose(scr);
X		scr=fopen(scratch_file,"r");
X		unlink(scratch_file);
X		TeXMatch(scr);
X		fseek(scr,0,0);
X		TeXExpand(scr,big,MAXLEN);
X		fclose(scr);
X		}
X	else
X		TeXMatch(stdin);
X	}

X/* then process input line for arguments and assume they are input files */
Xxargc = argc;
Xxargv = argv;
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' ) continue;		/* this is a flag */
X	if((temp=fopen(cptr,"r")) != NULL)
X		{
X		fprintf(stderr,"%s:\n",cptr);
X		TeXMatch(temp);
X		fprintf(stderr,"\n");
X		if (iflag != 1)
X			{
X			fseek(temp,0,0);
X			TeXExpand(temp,big,MAXLEN);
X			}
X		fclose(temp);
X		}
X	else
X		fprintf(stderr,"texmatch: Cannot open %s\n",cptr);
X	}

X}
@//E*O*F texmatch1.c//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - texmatch2.c
if test -f texmatch2.c ; then
    echo texmatch2.c exists, putting output in $$texmatch2.c
    OUT=$$texmatch2.c
    STATUS=1
else
    OUT=texmatch2.c
fi
sed 's/^X//' > $OUT <<'@//E*O*F texmatch2.c//'
X/*
X * texmatch: checks matching parantheses, braces, brackets, and dollar signs
X * in TeX documents.
X *
X * to compile:  cc texmatch.c -lsep -o texmatch
X */

Xchar *documentation[] = {
X" SYNTAX",
X"        texmatch [-i] [parameters] [inputfiles]",
X"",
X"        flags:",
X"              -i   ignores TeX's and LaTeX's \input and \include commands",
X"",
X"        parameters:",
X"              in=filename       filename is the input file",
X"                                (Default: in=stdin)",
X""
X};

X/* Author: Kamal Al-Yahya, Stanford University,		11/1/83 */
X/* Modified:						6/30/86 */

Xint	doclength = { sizeof documentation/sizeof documentation[0] };

X#include        <stdio.h>
X#include        <sys/ioctl.h>
X#include        <sgtty.h>
X#define	MAXLEN	100000		/* maximum characters in a document */

Xchar string[100],filename[100];
Xstruct sgttyb ttystat;
Xextern char *strcpy(), *mktemp();
Xchar scratch_file[100];

Xint wflag=0;		/* for consistency with other programs */
Xint xargc;
Xchar **xargv;

Xmain(argc,argv)
Xint argc; 
Xchar *argv[];
X{
Xchar big[MAXLEN];
XFILE *temp,*scr;
Xregister char *cptr;
Xint piped_in;
Xint i,iflag;

X/* If no arguments, and not in a pipeline, self document */
Xpiped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
Xif (argc == 1 && !piped_in)
X	{
X	for( i=0; i<doclength; i++)
X		printf("%s\n",documentation[i]);
X	exit (0);
X	}

X/* process option flags */
Xxargc = argc;
Xxargv = argv;
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' )
X		{
X		while( *(++cptr))
X			{
X			switch( *cptr )
X				{
X				case 'i':
X					iflag=1;
X					break;
X				default:
X			     		fprintf(stderr,
X					"unknown flag -%c\n",*cptr);
X					break;
X				}
X			}
X		}
X	}

X/* first process pipe input */
Xxargc = argc;
Xxargv = argv;
Xif(piped_in)
X	{
X	if (iflag != 1)
X		{
X/* need to buffer; can's seek in pipes */
X/* make a temporary and volatile file in /tmp */
X		strcpy(scratch_file,"/tmp/texXXXXXX");
X		mktemp(scratch_file);
X		scr=fopen(scratch_file,"w");
X		scrbuf(stdin,scr);
X		fclose(scr);
X		scr=fopen(scratch_file,"r");
X		unlink(scratch_file);
X		TeXMatch(scr);
X		fseek(scr,0,0);
X		TeXExpand(scr,big,MAXLEN);
X		fclose(scr);
X		}
X	else
X		TeXMatch(stdin);
X	}

X/* next process in=inputfiles */
Xif(getpar_("in","s",string))
X	{
X	sscanf(string,"%s",filename);
X	if((temp=fopen(filename,"r")) != NULL)
X		{
X		fprintf(stderr,"%s:\n",cptr);
X		TeXMatch(temp);
X		fprintf(stderr,"\n");
X		if (iflag != 1)
X			{
X			fseek(temp,0,0);
X			TeXExpand(temp,big,MAXLEN);
X			}
X		fclose(temp);
X		}
X	else
X		fprintf(stderr,"texmatch: Cannot open %s\n",filename);
X	}

X/* then process input line for arguments and assume they are input files */
Xfor (xargc--,xargv++; xargc; xargc--,xargv++)
X	{
X	cptr = *xargv; 
X	if( *cptr=='-' ) continue;		/* this is a flag */
X	while (*cptr)
X		{
X		if (*cptr == '=')  break; /* this is for getpar */
X		cptr++;
X		}       
X	if (*cptr)  continue;
X	cptr = *xargv;
X	if((temp=fopen(cptr,"r")) != NULL)
X		{
X		fprintf(stderr,"%s:\n",cptr);
X		TeXMatch(temp);
X		fprintf(stderr,"\n");
X		if (iflag != 1)
X			{
X			fseek(temp,0,0);
X			TeXExpand(temp,big,MAXLEN);
X			}
X		fclose(temp);
X		}
X	else
X		fprintf(stderr,"texmatch: Cannot open %s\n",cptr);
X	}

X}
@//E*O*F texmatch2.c//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - trmatch.1
if test -f trmatch.1 ; then
    echo trmatch.1 exists, putting output in $$trmatch.1
    OUT=$$trmatch.1
    STATUS=1
else
    OUT=trmatch.1
fi
sed 's/^X//' > $OUT <<'@//E*O*F trmatch.1//'
X.TH trmatch 1 7/10/86
X.UC 4
X.SH NAME
Xtrmatch \- checks matching in troff documents.
X.SH SYNOPSIS
X.B trmatch
X.I filename
X.SH DESCRIPTION
X.I Trmatch
Xgives error messages if it detects unmatched
Xbraces, brackets, parentheses, equations, and
Xdollar signs in troff documents.
XError messages are sent to the standard error.
X.br
XEscaped braces, brackets, parentheses, and dollar signs are not counted.
XText and equations are checked separately.
XIt takes equations to be delimited by .EQ and .EN.
XIf a ``define'' occurs in the equation, the line containing
Xthe ``define'' is not checked (since it is bound to have unmatches).
X.SH DIAGNOSTICS
XDisplayed equations that are started and ended by user-defined
Xcontrol sequences are regarded as text and matching is not checked
Xseparately.
X.SH SEE ALSO
Xtexmatch(1).
X.SH AUTHOR
XKamal Al-Yahya, Stanford University
@//E*O*F trmatch.1//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - trmatch.c
if test -f trmatch.c ; then
    echo trmatch.c exists, putting output in $$trmatch.c
    OUT=$$trmatch.c
    STATUS=1
else
    OUT=trmatch.c
fi
sed 's/^X//' > $OUT <<'@//E*O*F trmatch.c//'
X/*
X * trmatch: checks matching parantheses, braces, brackets, and dollar signs.
X *		for troff documents
X * non-getpar() version.
X * to compile:  cc trmatch.c -o trmatch
X */

Xchar *documentation[] = {
X" SYNTAX",
X"        trmatch file1 file2 ....",
X"",
X" See the manula page for more details",
X"",
X};

X/* Author:	Kamal Al-Yahya		7/20/1986 */

Xint	doclength = { sizeof documentation/sizeof documentation[0] };

X#include        <stdio.h>
X#include        <sys/ioctl.h>
X#include        <sgtty.h>

Xstruct sgttyb ttystat;
Xstatic char *name="trmatch";
Xextern char *strcpy(), *mktemp();

Xint xargc;
Xchar **xargv;

Xmain(argc,argv)
Xint argc; 
Xchar *argv[];
X{
X	FILE *temp;
X	register char *cptr;
X	int piped_in;
X	int i;

X	/* If no arguments, and not in a pipeline, self document */
X	piped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
X	if (argc == 1 && !piped_in)
X		{
X		for( i=0; i<doclength; i++)
X			printf("%s\n",documentation[i]);
X		exit (0);
X		}

X	 /* first process pipe input */
X	if(piped_in)
X		{
X		troff_match(stdin);
X		fprintf(stderr,"\n");
X		}

X/* next process input line arguments and assume they are also input files */

X	xargc = argc;
X	xargv = argv;
X	for (xargc--,xargv++; xargc; xargc--,xargv++)
X		{
X		cptr = *xargv; 
X		if((temp=fopen(cptr,"r")) != NULL)
X			{
X			fprintf(stderr,"%s:\n",cptr);
X			troff_match(temp);
X			fprintf(stderr,"\n");
X			fclose(temp);
X			}
X		else
X			fprintf(stderr,"%s: Cannot open %s\n",name,cptr);
X		}

X}

Xtroff_match(fp)			/* check matching */
XFILE *fp;
X{

Xint l=1;			/* line counter */
Xint ld=0;			/* single left dollar signs */
Xint rd=0;			/* single right dollar signs */
Xint eq=0;			/* eq=1 : equation (delimeted by .EQ and .EN) */
Xint lp=0;			/* left parantheses */
Xint rp=0;			/* right parantheses */
Xint lb=0;			/* left brackets */
Xint rb=0;			/* right brackets */
Xint lbr=0;			/* left braces */
Xint rbr=0;			/* right braces */
Xint c=' ';			/* current character */
Xint c1=' ';			/* previous character */
Xint lbrl=1;			/* line number of left braces */
Xint lbl=1;			/* line number of left bracket */
Xint lpl=1;			/* line number of left parentheses */
Xint ldl=1;			/* line number of left single dollar sign */
Xint eql=1;			/* line number at which equation is started */
Xint war=0;			/* warning status */
Xint esc=0;			/* escape status */

Xwhile ((c =getc(fp)) != EOF)
X	{
Xtop:
X	switch(c)
X		{
X		case '\n':
X			l++;		/* increment line counter */
X/* check to see if a single dollar sign is not closed at the same line */
X			if (ld == 1 && war == 0 && c1 != '\\')
X				{
X				fprintf(stderr,"line %d: WARNING: single dollar sign is not closed on the same line\n",l-1);
X				war=1;		/* warning has been given */
X				}
X			esc = 0;		/* escape status */
X			break;
X		case '{':
X			if (esc == 0)
X				{
X				lbr++;
X				if (lbrl == 0) lbrl=l;
X				}
X			esc = 0;		/* escape status */
X			break;
X		case '}':
X			if (esc == 0)	rbr++;
X			if (rbr > lbr)
X				{
X				fprintf(stderr,"line %d: unmatched braces\n",l);
X				rbr--;		/* reset the count */
X				}
X			if (lbr == rbr)	lbrl=0;
X			esc = 0;		/* escape status */
X			break;
X		case '[':
X			if (esc == 0)
X				{
X				lb++;
X				if (lbl == 0) lbl=l;
X				}
X			esc = 0;		/* escape status */
X			break;
X		case ']':
X			if (esc == 0)	rb++;
X			else		esc = 0;	/* escape status */
X			if (rb > lb)
X				{
X			     fprintf(stderr,"line %d: unmatched brackets\n",l);
X				rb--;		/* reset the count */
X				}
X			if (lb == rb)	lbl=0;
X			esc = 0;		/* escape status */
X			break;
X		case '(':
X			if (esc == 0)
X				{
X				lp++;
X				if (lpl == 0) lpl=l;
X				}
X			esc = 0;		/* escape status */
X			break;
X		case ')':
X			if (esc == 0)	rp++;
X			if (rp > lp)
X			    {
X			   fprintf(stderr,"line %d: unmatched parentheses\n",l);
X			    rp--;		/* reset the count */
X			    }
X			if (lp == rp)	lpl=0;
X			esc = 0;		/* escape status */
X			break;
X		case '$':
X			if (esc == 1)		/* escaped dollar sign */
X				{
X				c=' ';		/* reset the dollar sign */
X				esc = 0;	/* escape status */
X				break;
X				}
X			if (ld == 1)	rd=1;	/* right dollar sign */
X			else
X				{
X				ld=1; 	/* left dollar sign */
X				ldl=l;	/* line number */
X				war=0;	/* no warning hs been given */
X				}
X			esc = 0;		/* escape status */
X			break;
X		case '.':
X			if (c1 == '\n' || l == 1)	/* troff command */
X				{
X				/* see if it is .EQ */
X				c1=getc(fp);
X				if (c1 == '\n')
X					{
X					esc=0;
X					l++;
X					break;
X					}
X				c=getc(fp);
X				if (c == '\n')
X					{
X					esc=0;
X					l++;
X					break;
X					}
X				if (c1 == 'E' && c == 'Q')
X					{
X					if (eq == 1)
X	fprintf(stderr,"line %d: equation started while equation at line %d is still open\n",l,eql);
X					eq=1;	/* beginning of equation */
X					eql=l;	/* line number */
X/* Give warning about unclosed openings */
X					if ((lbr-rbr) > 0)
X	fprintf(stderr,"line %d: %d unclosed braces before equation, first brace opened at line %d\n",eql,lbr-rbr,lbrl);
X					if ((lb-rb) > 0)
X	fprintf(stderr,"line %d: %d unclosed brackets before equation, first bracket opened at line %d\n",eql,lb-rb,lbl);
X					if ((lp-rp) > 0)
X	fprintf(stderr,"line %d: %d unclosed parentheses before equation, first parenthesis opened at line %d\n",eql,lp-rp,lpl);
X/* clear registers */
X					lp=0; lb=0; lbr=0;
X					rp=0; rb=0; rbr=0;
X					lpl=0; lbrl=0; lbl=0;
X					}
X				else if (c1 == 'E' && c == 'N')
X					{
X					if (eq == 0)
X	fprintf(stderr,"line %d: equation ends but no equation beginning\n",l);
X/* Give warning about unclosed openings */
X					if ((lbr-rbr) > 0)
X	fprintf(stderr,"line %d: %d unclosed braces in equation\n",eql,lbr-rbr);
X					if ((lb-rb) > 0)
X	fprintf(stderr,"line %d: %d unclosed brackets in equation\n",eql,lb-rb);
X					if ((lp-rp) > 0)
X	fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",eql,lp-rp);
X/* clear registers */
X					lp=0; lb=0; lbr=0;
X					rp=0; rb=0; rbr=0;
X					lpl=0; lbrl=0; lbl=0;
X					eq=0;	/* end of equation */
X					}
X				else
X					while ((c = getc(fp)) != EOF)
X						if (c == '\n')
X							{
X							l++;
X							break;
X							}
X				}
X			esc = 0;		/* escape status */
X			break;
X		case 'd':
X/* check for possible define; ignore define lines */
X			esc = 0;
X			if (eq == 1 && c1 == '\n')
X				{
X				if ((c = getc(fp)) == 'e')
X				if ((c = getc(fp)) == 'f')
X				if ((c = getc(fp)) == 'i')
X				if ((c = getc(fp)) == 'n')
X				if ((c = getc(fp)) == 'e')
X					while ((c = getc(fp)) != EOF)
X						if (c == '\n')	break;
X				if (c == '\n')	l++;
X				}
X/* if we grapped a character not in the word "define", go to switch
X   to parse the rest of the line */
X			if (!(c=='d'||c=='e'||c=='f'||c=='i'||c=='n'||c=='\n'))
X						goto top;
X			c1 = ' ';
X			esc = 0;		/* escape status */
X			break;
X		case '\\':
X/* check escape status */
X			if (c1 == '\\' && esc == 1)	esc = 0;
X			else		esc = 1;
X			break;
X		default:
X			esc = 0;		/* escape status */
X			break;
X		}
X	c1=c;					/* update previous character */
X	if (ld == 1 && rd == 1)
X		{ld=0.;		rd=0.;}		/* matched dollar signs */
X	}
Xif ((lbr-rbr) > 0)
X	fprintf(stderr,"file ends: %d unclosed left braces, first opened at line %d \n",lbr-rbr,lbrl);
Xif ((lb-rb) > 0)
X	fprintf(stderr,"file ends: %d unclosed left brackets, first opened at line %d \n",lb-rb,lbl);
Xif ((lp-rp) > 0)
X	fprintf(stderr,"file ends: %d unclosed left parentheses, first opened at line %d \n",lp-rp,lpl);
Xif (ld == 1)
X	fprintf(stderr,"file ends: single dollar sign opened at line %d unclosed\n",ldl);
Xif (eq == 1)
X	fprintf(stderr,"file ends: equation started at line %d not closed\n",eql);
X}
@//E*O*F trmatch.c//
chmod u=rw,g=rw,o=rw $OUT
 
echo x - MANIFEST
if test -f MANIFEST ; then
    echo MANIFEST exists, putting output in $$MANIFEST
    OUT=$$MANIFEST
    STATUS=1
else
    OUT=MANIFEST
fi
sed 's/^X//' > $OUT <<'@//E*O*F MANIFEST//'
XMANIFEST                     2
XManifest                     1
XREADME                       1
XTEX                          1
XTEX.1                        1
XTeXExpand.c                  1
XTeXMatch.c                   1
Xdetex.1                      1
Xdetex1.c                     1
Xdetex2.c                     1
Xinc_file                     1
Xinc_file2.tex                1
Xmakefile                     1
Xmakefile.par                 1
Xtestfile                     1
Xtexeqn.1                     1
Xtexeqn1.c                    1
Xtexeqn2.c                    1
Xtexexpand.1                  1
Xtexexpand1.c                 2
Xtexexpand2.c                 2
Xtexmatch.1                   2
Xtexmatch1.c                  2
Xtexmatch2.c                  2
Xtexspell                     1
Xtrmatch.1                    2
Xtrmatch.c                    2
@//E*O*F MANIFEST//
chmod u=rw,g=rw,o=rw $OUT
 
echo Inspecting for damage in transit...
temp=/tmp/sharin$$; dtemp=/tmp/sharout$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
     131     319    2656 texexpand1.c
     183     431    3878 texexpand2.c
      35     158    1028 texmatch.1
     124     317    2452 texmatch1.c
     156     381    3152 texmatch2.c
      27     132     849 trmatch.1
     293    1161    7341 trmatch.c
      27      54     837 MANIFEST
     976    2953   22193 total
!!!
wc  texexpand1.c texexpand2.c texmatch.1 texmatch1.c texmatch2.c trmatch.1 trmatch.c MANIFEST | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if test -s $dtemp ; then
    echo "Ouch [diff of wc output]:"
    cat $dtemp
    STATUS=1
elif test $STATUS = 0 ; then
    echo "No problems found."
else
    echo "WARNING -- PROBLEMS WERE FOUND..."
fi
exit $STATUS