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
main(argc,argv)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
exch(i1,i2)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
comp(i1,i2)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
wrdoc(np,argc,argv,relfeed)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
lfind(wl,n,wds)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
str6cmp(s,t)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