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