1*12307Stut #ifndef lint
2*12307Stut static char *sccsid = "@(#)what1.c	4.1 (Berkeley) 05/06/83";
3*12307Stut #endif
4*12307Stut 
5*12307Stut #include "what..c"
6*12307Stut 
7*12307Stut struct filans files[NFILES];
8*12307Stut char fnames[NAMES];
9*12307Stut int relfeed 0;
10*12307Stut char *rb[NFEED];
11*12307Stut char rbb[200], *rbp rbb;
12*12307Stut ;
13*12307Stut 
14*12307Stut main(argc,argv)
15*12307Stut char *argv[];
16*12307Stut {
17*12307Stut 	char *s, *t, *xargv[50], *wd[50];
18*12307Stut 	struct filans *af;
19*12307Stut 	int xargc 0, nw, nf, i;
20*12307Stut 	while (argc>1 && argv[1][0]=='-')
21*12307Stut 	{
22*12307Stut 		switch(argv[1][1])
23*12307Stut 		{
24*12307Stut 		case 'r':
25*12307Stut 			relfeed=1;
26*12307Stut 			break;
27*12307Stut 		}
28*12307Stut 		argc--;
29*12307Stut 		argv++;
30*12307Stut 	}
31*12307Stut 	if (argc<=1)
32*12307Stut 	{
33*12307Stut 		printf("No query.\n");
34*12307Stut 		return(0);
35*12307Stut 	}
36*12307Stut 	nf = doclook(argc,argv,0);
37*12307Stut 	printf("   %d files\n",nf);
38*12307Stut 	if (relfeed && nf>NFEED)
39*12307Stut 	{
40*12307Stut 		wrdoc(NFEED, argc, argv, 1);
41*12307Stut 		nw = freqwd (rb, wd, argc);
42*12307Stut 		for(i=0; rb[i]; i++)
43*12307Stut 			unlink(rb[i]);
44*12307Stut 	}
45*12307Stut 	for(i=0; i<argc; i++)
46*12307Stut 		xargv[xargc++]=argv[i];
47*12307Stut 	if (relfeed)
48*12307Stut 	{
49*12307Stut 		printf("Adding: ");
50*12307Stut 		for(i=0; i<nw; i++)
51*12307Stut 			if (!lfind(wd[i], xargc, xargv))
52*12307Stut 				printf("%s ", xargv[xargc++]=wd[i]);
53*12307Stut 		printf("\n");
54*12307Stut 		nf = doclook(xargc, xargv, relfeed? xargc/4 : 0);
55*12307Stut 		printf("  %d files\n",nf);
56*12307Stut 	}
57*12307Stut 	shell (nf, comp, exch);
58*12307Stut 	wrdoc(nf, xargc, xargv, 0);
59*12307Stut 	return(0);
60*12307Stut }
61*12307Stut 
62*12307Stut exch( i1, i2 )
63*12307Stut {
64*12307Stut 	struct filans *p1, *p2;
65*12307Stut 	struct filans xt;
66*12307Stut 	p1=files+i1;
67*12307Stut 	p2=files+i2;
68*12307Stut 	xt = *p1;
69*12307Stut 	*p1 = *p2;
70*12307Stut 	*p2 = xt;
71*12307Stut }
72*12307Stut 
73*12307Stut comp(i1, i2)
74*12307Stut {
75*12307Stut 	struct filans *p1, *p2;
76*12307Stut 	p1 = files+i1;
77*12307Stut 	p2= files+i2;
78*12307Stut 	if (p1->fdate != p2->fdate)
79*12307Stut 		return(p2->fdate > p1->fdate);
80*12307Stut 	return(p2->uid >= p1->uid);
81*12307Stut }
82*12307Stut 
83*12307Stut wrdoc ( np, argc, argv, relfeed )
84*12307Stut {
85*12307Stut 	struct filans *af;
86*12307Stut 	char *s, *t, buf[200];
87*12307Stut 	int eval, k, pid;
88*12307Stut 	FILE *rf NULL;
89*12307Stut 	FILE *ans NULL;
90*12307Stut 	pid=getpid();
91*12307Stut 	for(af=files; af<files+np; af++)
92*12307Stut 	{
93*12307Stut 		t = ctime(&af->fdate);
94*12307Stut 		getpw(af->uid, s=buf);
95*12307Stut 		while (*s && *s!=':') s++;
96*12307Stut 		*s=0;
97*12307Stut 		printf("%s (%.20s)  %s, %ld bytes\n",af->nm,t+4,buf,af->size);
98*12307Stut 		if (relfeed)
99*12307Stut 		{
100*12307Stut 			k=af-files;
101*12307Stut 			_assert (k<NFEED);
102*12307Stut 			sprintf(rb[k]=rbp, "rf%d.%d",pid, k);
103*12307Stut 			rf = fopen(rb[k], "w");
104*12307Stut 			while (*rbp++);
105*12307Stut 		}
106*12307Stut 		describe(af->nm, argc,argv, rf);
107*12307Stut 		if (relfeed)
108*12307Stut 		{
109*12307Stut 			printf("You like that one?");
110*12307Stut 			fflush(stdout);
111*12307Stut 			fgets(buf, 100, stdin);
112*12307Stut 			switch(buf[0])
113*12307Stut 			{
114*12307Stut 			case 'y':
115*12307Stut 			case 'Y':
116*12307Stut 				eval=1;
117*12307Stut 				break;
118*12307Stut 			case 'n':
119*12307Stut 			case 'N':
120*12307Stut 				eval = -1;
121*12307Stut 				break;
122*12307Stut 			default:
123*12307Stut 				eval=0;
124*12307Stut 				break;
125*12307Stut 			}
126*12307Stut 			fclose(rf);
127*12307Stut 			if (eval<=0)
128*12307Stut 			{
129*12307Stut 				unlink(rb[k]);
130*12307Stut 				rb[k][0]=0;
131*12307Stut 			}
132*12307Stut 		}
133*12307Stut 	}
134*12307Stut 	if (relfeed) rb[np]=0;
135*12307Stut }
136*12307Stut 
137*12307Stut lfind( wl, n, wds)
138*12307Stut char *wl, *wds[];
139*12307Stut {
140*12307Stut 	int i;
141*12307Stut 	for(i=0; i<n; i++)
142*12307Stut 		if (str6cmp(wl, wds[i])==0)
143*12307Stut 			return(1);
144*12307Stut 	return(0);
145*12307Stut }
146*12307Stut 
147*12307Stut str6cmp(s, t)
148*12307Stut char *s, *t;
149*12307Stut {
150*12307Stut 	int i 0, c;
151*12307Stut 	while ( (c= *s++ ) == ( *t++))
152*12307Stut 		if (c==0 || ++i ==6)
153*12307Stut 			return(0);
154*12307Stut 	return(1);
155*12307Stut }
156