112307Stut #ifndef lint
2*32129Sbostic static char *sccsid = "@(#)what1.c	4.2 (Berkeley) 09/11/87";
312307Stut #endif
412307Stut 
512307Stut #include "what..c"
612307Stut 
712307Stut struct filans files[NFILES];
812307Stut char fnames[NAMES];
9*32129Sbostic int relfeed = 0;
1012307Stut char *rb[NFEED];
11*32129Sbostic char rbb[200], *rbp = rbb;
1212307Stut ;
1312307Stut 
1412307Stut main(argc,argv)
1512307Stut char *argv[];
1612307Stut {
1712307Stut 	char *s, *t, *xargv[50], *wd[50];
1812307Stut 	struct filans *af;
19*32129Sbostic 	int xargc = 0, nw, nf, i;
2012307Stut 	while (argc>1 && argv[1][0]=='-')
2112307Stut 	{
2212307Stut 		switch(argv[1][1])
2312307Stut 		{
2412307Stut 		case 'r':
2512307Stut 			relfeed=1;
2612307Stut 			break;
2712307Stut 		}
2812307Stut 		argc--;
2912307Stut 		argv++;
3012307Stut 	}
3112307Stut 	if (argc<=1)
3212307Stut 	{
3312307Stut 		printf("No query.\n");
3412307Stut 		return(0);
3512307Stut 	}
3612307Stut 	nf = doclook(argc,argv,0);
3712307Stut 	printf("   %d files\n",nf);
3812307Stut 	if (relfeed && nf>NFEED)
3912307Stut 	{
4012307Stut 		wrdoc(NFEED, argc, argv, 1);
4112307Stut 		nw = freqwd (rb, wd, argc);
4212307Stut 		for(i=0; rb[i]; i++)
4312307Stut 			unlink(rb[i]);
4412307Stut 	}
4512307Stut 	for(i=0; i<argc; i++)
4612307Stut 		xargv[xargc++]=argv[i];
4712307Stut 	if (relfeed)
4812307Stut 	{
4912307Stut 		printf("Adding: ");
5012307Stut 		for(i=0; i<nw; i++)
5112307Stut 			if (!lfind(wd[i], xargc, xargv))
5212307Stut 				printf("%s ", xargv[xargc++]=wd[i]);
5312307Stut 		printf("\n");
5412307Stut 		nf = doclook(xargc, xargv, relfeed? xargc/4 : 0);
5512307Stut 		printf("  %d files\n",nf);
5612307Stut 	}
5712307Stut 	shell (nf, comp, exch);
5812307Stut 	wrdoc(nf, xargc, xargv, 0);
5912307Stut 	return(0);
6012307Stut }
6112307Stut 
6212307Stut exch( i1, i2 )
6312307Stut {
6412307Stut 	struct filans *p1, *p2;
6512307Stut 	struct filans xt;
6612307Stut 	p1=files+i1;
6712307Stut 	p2=files+i2;
6812307Stut 	xt = *p1;
6912307Stut 	*p1 = *p2;
7012307Stut 	*p2 = xt;
7112307Stut }
7212307Stut 
7312307Stut comp(i1, i2)
7412307Stut {
7512307Stut 	struct filans *p1, *p2;
7612307Stut 	p1 = files+i1;
7712307Stut 	p2= files+i2;
7812307Stut 	if (p1->fdate != p2->fdate)
7912307Stut 		return(p2->fdate > p1->fdate);
8012307Stut 	return(p2->uid >= p1->uid);
8112307Stut }
8212307Stut 
8312307Stut wrdoc ( np, argc, argv, relfeed )
8412307Stut {
8512307Stut 	struct filans *af;
86*32129Sbostic 	char *s, *t, buf[200], *ctime();
8712307Stut 	int eval, k, pid;
88*32129Sbostic 	FILE *rf = NULL;
89*32129Sbostic 	FILE *ans = NULL;
9012307Stut 	pid=getpid();
9112307Stut 	for(af=files; af<files+np; af++)
9212307Stut 	{
9312307Stut 		t = ctime(&af->fdate);
9412307Stut 		getpw(af->uid, s=buf);
9512307Stut 		while (*s && *s!=':') s++;
9612307Stut 		*s=0;
9712307Stut 		printf("%s (%.20s)  %s, %ld bytes\n",af->nm,t+4,buf,af->size);
9812307Stut 		if (relfeed)
9912307Stut 		{
10012307Stut 			k=af-files;
10112307Stut 			_assert (k<NFEED);
10212307Stut 			sprintf(rb[k]=rbp, "rf%d.%d",pid, k);
10312307Stut 			rf = fopen(rb[k], "w");
10412307Stut 			while (*rbp++);
10512307Stut 		}
10612307Stut 		describe(af->nm, argc,argv, rf);
10712307Stut 		if (relfeed)
10812307Stut 		{
10912307Stut 			printf("You like that one?");
11012307Stut 			fflush(stdout);
11112307Stut 			fgets(buf, 100, stdin);
11212307Stut 			switch(buf[0])
11312307Stut 			{
11412307Stut 			case 'y':
11512307Stut 			case 'Y':
11612307Stut 				eval=1;
11712307Stut 				break;
11812307Stut 			case 'n':
11912307Stut 			case 'N':
12012307Stut 				eval = -1;
12112307Stut 				break;
12212307Stut 			default:
12312307Stut 				eval=0;
12412307Stut 				break;
12512307Stut 			}
12612307Stut 			fclose(rf);
12712307Stut 			if (eval<=0)
12812307Stut 			{
12912307Stut 				unlink(rb[k]);
13012307Stut 				rb[k][0]=0;
13112307Stut 			}
13212307Stut 		}
13312307Stut 	}
13412307Stut 	if (relfeed) rb[np]=0;
13512307Stut }
13612307Stut 
13712307Stut lfind( wl, n, wds)
13812307Stut char *wl, *wds[];
13912307Stut {
14012307Stut 	int i;
14112307Stut 	for(i=0; i<n; i++)
14212307Stut 		if (str6cmp(wl, wds[i])==0)
14312307Stut 			return(1);
14412307Stut 	return(0);
14512307Stut }
14612307Stut 
14712307Stut str6cmp(s, t)
14812307Stut char *s, *t;
14912307Stut {
150*32129Sbostic 	int i = 0, c;
15112307Stut 	while ( (c= *s++ ) == ( *t++))
15212307Stut 		if (c==0 || ++i ==6)
15312307Stut 			return(0);
15412307Stut 	return(1);
15512307Stut }
156