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