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