DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T t

⟦5707cec9f⟧ TextFile

    Length: 8152 (0x1fd8)
    Types: TextFile
    Names: »trmatch.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/trmatch/trmatch.c« 

TextFile

/*
 * trmatch: checks matching parantheses, braces, brackets, and dollar signs.
 *		for troff documents
 *
 * to compile:  cc trmatch.c -lsep -o trmatch
 */

char *documentation[] = {
" NAME",
"        trmatch",
"",
" SYNTAX",
"        trmatch [parameters] [inputfiles]",
"",
"        parameters:",
"              in=filename       filename is the input file",
"                                (Default: in=stdin)",
"",
};

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

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

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

char string[80],filename[80];
struct sgttyb ttystat;
static char *name="trmatch";
extern char *strcpy(), *mktemp();

/* for getpar */
int xargc;
char **xargv;

main(argc,argv)
int argc; 
char *argv[];
{
	FILE *temp;
	register char *cptr;
	int piped_in;
	int i;

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

	/* process getpar parameters */
	xargc = argc;
	xargv = argv;

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

#ifdef GETPAR
	/* next process in=inputfiles */
	if(getpar_("in","s",string))
		{
		sscanf(string,"%s",filename);
		if((temp=fopen(filename,"r")) != NULL)
			{
			fprintf(stderr,"%s:\n",filename);
			troff_match(temp);
			fprintf(stderr,"\n");
			fclose(temp);
			}
		else
			fprintf(stderr,"%s: Cannot open %s\n",name,filename);
		}
#endif	/* GETPAR */

	/*
	 * finally process input line for non-getpar arguments and assume
	 * they are also input files
	 */
	for (xargc--,xargv++; xargc; xargc--,xargv++)
		{
		cptr = *xargv; 
		if( *cptr=='-' ) continue; /* this is a flag */
		while (*cptr)
			{
#ifdef	GETPAR
			if (*cptr == '=')  break; /* this is for getpar */
#endif	/* GETPAR */
			cptr++;
			}       
		if (*cptr)  continue;
		cptr = *xargv;
		if((temp=fopen(cptr,"r")) != NULL)
			{
			fprintf(stderr,"%s:\n",cptr);
			troff_match(temp);
			fprintf(stderr,"\n");
			fclose(temp);
			}
		else
			fprintf(stderr,"%s: Cannot open %s\n",name,cptr);
		}

}

troff_match(fp)			/* check matching */
FILE *fp;
{

int l=1;			/* line counter */
int ld=0;			/* single left dollar signs */
int rd=0;			/* single right dollar signs */
int eq=0;			/* eq=1 : equation (delimeted by .EQ and .EN) */
int lp=0;			/* left parantheses */
int rp=0;			/* right parantheses */
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 parentheses */
int ldl=1;			/* line number of left single dollar sign */
int eql=1;			/* line number at which equation is started */
int war=0;			/* warning status */
int esc=0;			/* escape status */

while ((c =getc(fp)) != EOF)
	{
top:
	switch(c)
		{
		case '\n':
			l++;		/* increment line counter */
/* check to see if a single dollar sign is not closed at the same line */
			if (ld == 1 && war == 0 && c1 != '\\')
				{
				fprintf(stderr,"line %d: WARNING: single dollar sign is not closed on the same line\n",l-1);
				war=1;		/* warning has been given */
				}
			esc = 0;		/* escape status */
			break;
		case '{':
			if (esc == 0)
				{
				lbr++;
				if (lbrl == 0) lbrl=l;
				}
			esc = 0;		/* escape status */
			break;
		case '}':
			if (esc == 0)	rbr++;
			if (rbr > lbr)
				{
				fprintf(stderr,"line %d: unmatched braces\n",l);
				rbr--;		/* reset the count */
				}
			if (lbr == rbr)	lbrl=0;
			esc = 0;		/* escape status */
			break;
		case '[':
			if (esc == 0)
				{
				lb++;
				if (lbl == 0) lbl=l;
				}
			esc = 0;		/* escape status */
			break;
		case ']':
			if (esc == 0)	rb++;
			else		esc = 0;	/* escape status */
			if (rb > lb)
				{
			     fprintf(stderr,"line %d: unmatched brackets\n",l);
				rb--;		/* reset the count */
				}
			if (lb == rb)	lbl=0;
			esc = 0;		/* escape status */
			break;
		case '(':
			if (esc == 0)
				{
				lp++;
				if (lpl == 0) lpl=l;
				}
			esc = 0;		/* escape status */
			break;
		case ')':
			if (esc == 0)	rp++;
			if (rp > lp)
			    {
			   fprintf(stderr,"line %d: unmatched parentheses\n",l);
			    rp--;		/* reset the count */
			    }
			if (lp == rp)	lpl=0;
			esc = 0;		/* escape status */
			break;
		case '$':
			if (esc == 1)		/* escaped dollar sign */
				{
				c=' ';		/* reset the dollar sign */
				esc = 0;	/* escape status */
				break;
				}
			if (ld == 1)	rd=1;	/* right dollar sign */
			else
				{
				ld=1; 	/* left dollar sign */
				ldl=l;	/* line number */
				war=0;	/* no warning hs been given */
				}
			esc = 0;		/* escape status */
			break;
		case '.':
			if (c1 == '\n' || l == 1)	/* troff command */
				{
				/* see if it is .EQ */
				c1=getc(fp);
				if (c1 == '\n')
					{
					esc=0;
					l++;
					break;
					}
				c=getc(fp);
				if (c == '\n')
					{
					esc=0;
					l++;
					break;
					}
				if (c1 == 'E' && c == 'Q')
					{
					if (eq == 1)
	fprintf(stderr,"line %d: equation started while equation at line %d is still open\n",l,eql);
					eq=1;	/* beginning of equation */
					eql=l;	/* line number */
/* Give warning about unclosed openings */
					if ((lbr-rbr) > 0)
	fprintf(stderr,"line %d: %d unclosed braces before equation, first brace opened at line %d\n",eql,lbr-rbr,lbrl);
					if ((lb-rb) > 0)
	fprintf(stderr,"line %d: %d unclosed brackets before equation, first bracket opened at line %d\n",eql,lb-rb,lbl);
					if ((lp-rp) > 0)
	fprintf(stderr,"line %d: %d unclosed parentheses before equation, first parenthesis opened at line %d\n",eql,lp-rp,lpl);
/* clear registers */
					lp=0; lb=0; lbr=0;
					rp=0; rb=0; rbr=0;
					lpl=0; lbrl=0; lbl=0;
					}
				else if (c1 == 'E' && c == 'N')
					{
					if (eq == 0)
	fprintf(stderr,"line %d: equation ends but no equation beginning\n",l);
/* Give warning about unclosed openings */
					if ((lbr-rbr) > 0)
	fprintf(stderr,"line %d: %d unclosed braces in equation\n",eql,lbr-rbr);
					if ((lb-rb) > 0)
	fprintf(stderr,"line %d: %d unclosed brackets in equation\n",eql,lb-rb);
					if ((lp-rp) > 0)
	fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",eql,lp-rp);
/* clear registers */
					lp=0; lb=0; lbr=0;
					rp=0; rb=0; rbr=0;
					lpl=0; lbrl=0; lbl=0;
					eq=0;	/* end of equation */
					}
				else
					while ((c = getc(fp)) != EOF)
						if (c == '\n')
							{
							l++;
							break;
							}
				}
			esc = 0;		/* escape status */
			break;
		case 'd':
/* check for possible define; ignore define lines */
			esc = 0;
			if (eq == 1 && c1 == '\n')
				{
				if ((c = getc(fp)) == 'e')
				if ((c = getc(fp)) == 'f')
				if ((c = getc(fp)) == 'i')
				if ((c = getc(fp)) == 'n')
				if ((c = getc(fp)) == 'e')
					while ((c = getc(fp)) != EOF)
						if (c == '\n')	break;
				if (c == '\n')	l++;
				}
/* if we grapped a character not in the word "define", go to switch
   to parse the rest of the line */
			if (!(c=='d'||c=='e'||c=='f'||c=='i'||c=='n'||c=='\n'))
						goto top;
			c1 = ' ';
			esc = 0;		/* escape status */
			break;
		case '\\':
/* check escape status */
			if (c1 == '\\' && esc == 1)	esc = 0;
			else		esc = 1;
			break;
		default:
			esc = 0;		/* escape status */
			break;
		}
	c1=c;					/* update previous character */
	if (ld == 1 && rd == 1)
		{ld=0.;		rd=0.;}		/* matched 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 (eq == 1)
	fprintf(stderr,"file ends: equation started at line %d not closed\n",eql);
}