V10/cmd/wwb/odouble.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include "cbtype.h"
char *getl();
char *filename;
int lineno;
char *beg1, *beg2;
char left = '\0';
char right = '\0';
main(argc,argv)
char *argv[];
{
	int doub = 0;

	if(argc <= 1){
		filename = "stdin";
		doub = work();
	}
	else {
		while(argc > 1){
			argc--; argv++;
			if(freopen(argv[0], "r", stdin) == NULL){
				fprintf(stderr,"DOUBLE CANNOT OPEN FILE %s\n",argv[0]);
				continue;
			}
			filename = argv[0];
			doub += work();
		}
	}
	exit(doub);
}
char buf1[512];
char buf2[512];
int toggle;
char *p1, *p2;
char word[80], prev[80];
char delim[] = "delim";
work()
{
	char *b;
	int doub;
	int flag, lend;
	int skip;
	int l;
	doub = 0;
	lend = 1;
	lineno = 1;
	skip = 0;
	beg1 = p1 = getl(buf1);
	toggle = 1;
        strcpy(prev,"qqxz");
	while((flag=getword()) != 0){
		if(flag == 2)
			if(toggle == 1)b=beg2;
			else b=beg1;
		else if(toggle == 1)b = beg1;
		else b = beg2;
		if(*b == '.'){
			if(strcmp(word,"TS") == 0 || strcmp(word,"EQ")== 0 ||
			    strcmp(word,"DS") == 0 || strcmp(word,"PS") == 0){
				skip++;
				continue;
			}
			else if(strcmp(word, "TE") == 0|| strcmp(word,"EN") == 0 ||
			      strcmp(word,"DE") == 0 ||strcmp(word,"PE") == 0){
				if(--skip < 0)skip = 0;
				continue;
			}
		}
		if(strcmp(word, delim) == 0 && skip){
			getdel();
			continue;
		}
                if (strcmp(word, prev) ==0 && skip == 0){
                        if(word[1]=='\0' && word[0] !='a')
                                ;
			else {
				if(lend == 1 && flag != 3){
					if(flag == 2)l=lineno-1;
					else l=lineno;
					printf("%s twice line %d file %s\n",prev,l,filename);
					if(flag == toggle)
						printf("%s\n",buf1);
					else printf("%s\n",buf2);
				}
				else {
					printf("%s twice beginning line %d file %s\n",prev,lineno-1,filename);
					if(toggle == 2)printf("%s%s\n",buf1,buf2);
					else printf("%s%s\n",buf2,buf1);
				}
                                doub++;
				flag = 1;
                        }
                }
                strcpy(prev,word);
		lend = flag;
        }
        return(doub);
}
getword()
{
	int c;
	char *p, *w;
	int reset;
	int ret;
	int skip;
	ret = 1;
	reset=skip=0;
	w = word;
	if(toggle == 1)p=p1;
	else p=p2;
rest:
	while(*p != '\n'){
		if(*p == left){
			if(skip == 1 && *p == right)skip = 0;
			else {
				skip = 1;
				strcpy(prev,"qqxz");
			}
			p++;
			continue;
		}
		if(*p == right){
			skip = 0;
			p++;
			continue;
		}
		if(skip){
			p++;
			continue;
		}
		if(isalpha(*p) ||(w > word &&(*p == '-' || *p == '\''|| isdigit(*p))))
			*w++ = *p++;
		else if(w == word){
			if(*p == '\\'){
				p++;
				if(*p == '(')p+=2;
				strcpy(prev,"qqxz");
				ret=1;
				reset=1;
			}
			if(isdigit(*p) || isop(*p)|| *p == '/' || *p == '('){
				strcpy(prev,"qqxz");
				ret=1;
				reset=1;
			}
			p++;
		}
		else {
			*w = '\0';
			if(toggle == 1)p1 = p;
			else p2 = p;
			return(ret);
		}
        }
	lineno++;
	if(toggle == 1){
		beg2 = p = p2 = getl(buf2);
		toggle = 2;
	}
	else {
		beg1 = p = p1 = getl(buf1);
		toggle = 1;
	}
	if(p == EOF)return(0);
	if(w == word){
		if(reset == 0)ret = 3;
		goto rest;
	}
	*w = '\0';
	return(2);
}
char *
getl(p)
char *p;
{
	int c;
	char *q;
	q = p;
	while((*q++ = c = getchar()) != '\n'){
		if(q >= p + 511){
			printf("out of buffer space\n");
			exit(1);
		}
		if(c == EOF)
			return((char *)c);
	}
	*q = '\0';
	return(p);
}
getdel(){
	char *p;
	if(toggle == 1)p=p1;
	else p=p2;
	while(*p == ' ')p++;
	left = *p++;
	right = *p++;
	if(toggle == 1)p1=p;
	else p2=p;
}