| 1/* 2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5
|
1/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 2/* All Rights Reserved */ 3
| 6/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 7/* All Rights Reserved */ 8
|
4
| |
5/* 6 * Copyright (c) 1980 Regents of the University of California. 7 * All rights reserved. The Berkeley software License Agreement 8 * specifies the terms and conditions for redistribution. 9 */ 10
| 9/* 10 * Copyright (c) 1980 Regents of the University of California. 11 * All rights reserved. The Berkeley software License Agreement 12 * specifies the terms and conditions for redistribution. 13 */ 14
|
11/* 12 * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc. 13 * All Rights Reserved. 14 */
| 15#pragma ident "%Z%%M% %I% %E% SMI"
|
15
| 16
|
16#pragma ident "%Z%%M% %I% %E% SMI" 17 18# include <locale.h> 19# include <stdio.h> 20# include <assert.h>
| 17#include <locale.h> 18#include <stdio.h> 19#include <assert.h>
|
21extern char refdir[]; 22extern int keepold; 23extern char *fgnames[]; 24extern char **fgnamp;
| 20extern char refdir[]; 21extern int keepold; 22extern char *fgnames[]; 23extern char **fgnamp;
|
25FILE *fd =NULL; 26int lmaster =500;
| 24FILE *fd = NULL; 25int lmaster = 500;
|
27int *hfreq, hfrflg;
| 26int *hfreq, hfrflg;
|
28int colevel =0; 29int measure=0; 30int soutlen =1000; 31int reached =0; 32int iflong =0; 33int prfreqs =0;
| 27int colevel = 0; 28int measure = 0; 29int soutlen = 1000; 30int reached = 0; 31int iflong = 0; 32int prfreqs = 0;
|
34char usedir[100];
| 33char usedir[100];
|
35char * calloc(); 36char * todir();
| 34char *calloc(); 35char *todir();
|
37char gfile[50];
| 36char gfile[50];
|
38static int full =1000; 39static int tags =0;
| 37static int full = 1000; 38static int tags = 0;
|
40char *sinput, *soutput, *tagout;
| 39char *sinput, *soutput, *tagout;
|
41long indexdate =0, gdate();
| 40long indexdate = 0, gdate();
|
42
| 41
|
43main(argc,argv) 44char *argv[];
| 42extern int baddrop(); 43extern int doquery(); 44extern void err(); 45extern long findline(); 46extern int getq(); 47extern void grepcall(); 48extern int makefgrep(); 49extern void result(); 50extern void tick(); 51extern void tock(); 52 53static int setfrom(char); 54 55int 56main(int argc, char *argv[])
|
45{ 46 /* read query from stdin, expect name of indexes in argv[1] */ 47 static FILE *fa, *fb, *fc; 48 char nma[100], nmb[100], nmc[100], *qitem[100], *rprog = NULL; 49 char nmd[100], grepquery[256];
| 57{ 58 /* read query from stdin, expect name of indexes in argv[1] */ 59 static FILE *fa, *fb, *fc; 60 char nma[100], nmb[100], nmc[100], *qitem[100], *rprog = NULL; 61 char nmd[100], grepquery[256];
|
50 static char oldname[30] ; 51 static int was =0;
| 62 static char oldname[30]; 63 static int was = 0;
|
52 /* these pointers are unions of pointer to int and pointer to long */ 53 long *hpt;
| 64 /* these pointers are unions of pointer to int and pointer to long */ 65 long *hpt;
|
54 unsigned *master =0;
| 66 unsigned *master = 0;
|
55 int falseflg, nhash, nitem, nfound, frtbl, kk; 56 57 /* special wart for refpart: default is tags only */ 58 59 (void) setlocale(LC_ALL, ""); 60 61#if !defined(TEXT_DOMAIN)
| 67 int falseflg, nhash, nitem, nfound, frtbl, kk; 68 69 /* special wart for refpart: default is tags only */ 70 71 (void) setlocale(LC_ALL, ""); 72 73#if !defined(TEXT_DOMAIN)
|
62#define TEXT_DOMAIN "SYS_TEST"
| 74#define TEXT_DOMAIN "SYS_TEST"
|
63#endif 64 (void) textdomain(TEXT_DOMAIN); 65 66 falseflg = 0; 67
| 75#endif 76 (void) textdomain(TEXT_DOMAIN); 77 78 falseflg = 0; 79
|
68 while (argc > 1 && argv[1][0] == '-') 69 { 70 switch(argv[1][1]) 71 {
| 80 while (argc > 1 && argv[1][0] == '-') { 81 switch (argv[1][1]) {
|
72 case 'a': /* all output, incl. false drops */
| 82 case 'a': /* all output, incl. false drops */
|
73 falseflg = 1;
| 83 falseflg = 1;
|
74 break; 75 case 'r':
| 84 break; 85 case 'r':
|
76 argc--;
| 86 argc--;
|
77 argv++; 78 rprog = argv[1]; 79 break; 80 case 'F': /* put out full text */ 81 full = setfrom(argv[1][2]); 82 break; 83 case 'T': /* put out tags */ 84 tags = setfrom(argv[1][2]); 85 break; 86 case 'i': /* input in argument string */
| 87 argv++; 88 rprog = argv[1]; 89 break; 90 case 'F': /* put out full text */ 91 full = setfrom(argv[1][2]); 92 break; 93 case 'T': /* put out tags */ 94 tags = setfrom(argv[1][2]); 95 break; 96 case 'i': /* input in argument string */
|
87 argc--;
| 97 argc--;
|
88 argv++; 89 sinput = argv[1]; 90 break;
| 98 argv++; 99 sinput = argv[1]; 100 break;
|
91 case 's': /*text output to string */
| 101 case 's': /* text output to string */
|
92 case 'o':
| 102 case 'o':
|
93 argc--;
| 103 argc--;
|
94 argv++; 95 soutput = argv[1];
| 104 argv++; 105 soutput = argv[1];
|
96 if ((int) argv[2]<16000) 97 {
| 106 if ((int)argv[2] < 16000) {
|
98 soutlen = (int)argv[2];
| 107 soutlen = (int)argv[2];
|
99 argc--;
| 108 argc--;
|
100 argv++; 101 } 102 break;
| 109 argv++; 110 } 111 break;
|
103 case 't': /*tag output to string */ 104 argc--;
| 112 case 't': /* tag output to string */ 113 argc--;
|
105 argv++; 106 tagout = argv[1]; 107 break; 108 case 'l': /* length of internal lists */
| 114 argv++; 115 tagout = argv[1]; 116 break; 117 case 'l': /* length of internal lists */
|
109 argc--;
| 118 argc--;
|
110 argv++; 111 lmaster = atoi(argv[1]); 112 break; 113 case 'g': /* suppress fgrep search on old files */ 114 keepold = 0; 115 break; 116 case 'C': /* coordination level */ 117 colevel = atoi(argv[1]+2);
| 119 argv++; 120 lmaster = atoi(argv[1]); 121 break; 122 case 'g': /* suppress fgrep search on old files */ 123 keepold = 0; 124 break; 125 case 'C': /* coordination level */ 126 colevel = atoi(argv[1]+2);
|
118# if D1 119 fprintf(stderr, "colevel set to %d\n",colevel); 120# endif
| 127#if D1 128 fprintf(stderr, "colevel set to %d\n", colevel); 129#endif
|
121 break; 122 case 'P': /* print term freqs */
| 130 break; 131 case 'P': /* print term freqs */
|
123 prfreqs=1;
| 132 prfreqs = 1;
|
124 break; 125 case 'm':
| 133 break; 134 case 'm':
|
126 measure=1;
| 135 measure = 1;
|
127 break; 128 }
| 136 break; 137 }
|
129 argc--;
| 138 argc--;
|
130 argv++; 131 }
| 139 argv++; 140 }
|
132 if(argc < 2)
| 141 if (argc < 2)
|
133 exit(1);
| 142 exit(1);
|
134 strcpy (nma, todir(argv[1])); 135 if (was == 0 || strcmp (oldname, nma) !=0) 136 { 137 strcpy (oldname,nma); 138 strcpy (nmb, nma); 139 strcpy (nmc, nmb); 140 strcpy(nmd,nma); 141 strcat (nma, ".ia"); 142 strcat (nmb, ".ib"); 143 strcat (nmc, ".ic"); 144 strcat (nmd, ".id"); 145 if (was) 146 { 147 fclose(fa); 148 fclose(fb);
| 143 strcpy(nma, todir(argv[1])); 144 if (was == 0 || strcmp(oldname, nma) != 0) { 145 strcpy(oldname, nma); 146 strcpy(nmb, nma); 147 strcpy(nmc, nmb); 148 strcpy(nmd, nma); 149 strcat(nma, ".ia"); 150 strcat(nmb, ".ib"); 151 strcat(nmc, ".ic"); 152 strcat(nmd, ".id"); 153 if (was) { 154 fclose(fa); 155 fclose(fb);
|
149 fclose(fc); 150 } 151 152 fa = fopen(nma, "r");
| 156 fclose(fc); 157 } 158 159 fa = fopen(nma, "r");
|
153 if (fa==NULL) 154 { 155 strcpy(*fgnamp++ = calloc(strlen(oldname)+2,1), oldname); 156 fb=NULL;
| 160 if (fa == NULL) { 161 strcpy(*fgnamp++ = calloc(strlen(oldname)+2, 1), 162 oldname); 163 fb = NULL;
|
157 goto search; 158 } 159 fb = fopen(nmb, "r"); 160 fc = fopen(nmc, "r");
| 164 goto search; 165 } 166 fb = fopen(nmb, "r"); 167 fc = fopen(nmc, "r");
|
161 was =1; 162 if (fb== NULL || fc ==NULL) 163 {
| 168 was = 1; 169 if (fb == NULL || fc == NULL) {
|
164 err(gettext("Index incomplete %s"), nmb); 165 exit(1); 166 } 167 indexdate = gdate(fb); 168 fd = fopen(nmd, "r"); 169 }
| 170 err(gettext("Index incomplete %s"), nmb); 171 exit(1); 172 } 173 indexdate = gdate(fb); 174 fd = fopen(nmd, "r"); 175 }
|
170 fseek (fa, 0L, 0); 171 fread (&nhash, sizeof(nhash), 1, fa); 172 fread (&iflong, sizeof(iflong), 1, fa); 173 if(master==0) 174 master = (unsigned *) calloc (lmaster, iflong? sizeof(long): sizeof(unsigned)); 175 hpt = (long *) calloc(nhash, sizeof(*hpt)); 176 kk=fread( hpt, sizeof(*hpt), nhash, fa); 177# if D1 178 fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash); 179# endif 180 assert (kk==nhash); 181 hfreq = (int *) calloc(nhash, sizeof(*hfreq)); 182 assert (hfreq != NULL); 183 frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa);
| 176 fseek(fa, 0L, 0); 177 fread(&nhash, sizeof (nhash), 1, fa); 178 fread(&iflong, sizeof (iflong), 1, fa); 179 if (master == 0) 180 master = (unsigned *)calloc(lmaster, iflong ? 181 sizeof (long) : sizeof (unsigned)); 182 hpt = (long *)calloc(nhash, sizeof (*hpt)); 183 kk = fread(hpt, sizeof (*hpt), nhash, fa); 184#if D1 185 fprintf(stderr, "read %d hashes, iflong %d, nhash %d\n", 186 kk, iflong, nhash); 187#endif 188 assert(kk == nhash); 189 hfreq = (int *)calloc(nhash, sizeof (*hfreq)); 190 assert(hfreq != NULL); 191 frtbl = fread(hfreq, sizeof (*hfreq), nhash, fa);
|
184 hfrflg = (frtbl == nhash);
| 192 hfrflg = (frtbl == nhash);
|
185# if D1
| 193#if D1
|
186 fprintf(stderr, "read freqs %d\n", frtbl);
| 194 fprintf(stderr, "read freqs %d\n", frtbl);
|
187# endif
| 195#endif
|
188 189search:
| 196 197search:
|
190 while (1) 191 {
| 198 while (1) {
|
192 nitem = getq(qitem); 193 if (measure) tick();
| 199 nitem = getq(qitem); 200 if (measure) tick();
|
194 if (nitem==0) continue;
| 201 if (nitem == 0) continue;
|
195 if (nitem < 0) break;
| 202 if (nitem < 0) break;
|
196 if (tagout) tagout[0]=0; 197 if (fb!=NULL) 198 {
| 203 if (tagout) tagout[0] = 0; 204 if (fb != NULL) {
|
199 nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
| 205 nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
|
200# if D1 201 fprintf(stderr,"after doquery nfound %d\n", nfound); 202# endif 203 fgnamp=fgnames;
| 206#if D1 207 fprintf(stderr, "after doquery nfound %d\n", nfound); 208#endif 209 fgnamp = fgnames;
|
204 if (falseflg == 0)
| 210 if (falseflg == 0)
|
205 nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full); 206# if D1 207 fprintf(stderr,"after baddrop nfound %d\n", nfound); 208# endif
| 211 nfound = baddrop(master, nfound, fc, 212 nitem, qitem, rprog, full); 213#if D1 214 fprintf(stderr, "after baddrop nfound %d\n", nfound); 215#endif
|
209 }
| 216 }
|
210 if (fgnamp>fgnames) 211 {
| 217 if (fgnamp > fgnames) {
|
212 char **fgp, tgbuff[100]; 213 int k;
| 218 char **fgp, tgbuff[100]; 219 int k;
|
214# if D1
| 220#if D1
|
215 fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
| 221 fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
|
216# endif
| 222#endif
|
217 (void) memset(tgbuff, 0, sizeof (tgbuff));
| 223 (void) memset(tgbuff, 0, sizeof (tgbuff));
|
218 grepquery[0]=0; 219 for(k=0; k<nitem; k++) 220 {
| 224 grepquery[0] = 0; 225 for (k = 0; k < nitem; k++) {
|
221 strcat(grepquery, " "); 222 strcat(grepquery, qitem[k]); 223 }
| 226 strcat(grepquery, " "); 227 strcat(grepquery, qitem[k]); 228 }
|
224# if D1 225 fprintf(stderr, "grepquery %s\n",grepquery); 226# endif 227 for(fgp=fgnames; fgp<fgnamp; fgp++) 228 { 229# if D1 230 fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery); 231# endif
| 229#if D1 230 fprintf(stderr, "grepquery %s\n", grepquery); 231#endif 232 for (fgp = fgnames; fgp < fgnamp; fgp++) { 233#if D1 234 fprintf(stderr, "Now on %s query /%s/\n", 235 *fgp, grepquery); 236#endif
|
232 makefgrep(*fgp);
| 237 makefgrep(*fgp);
|
233# if D1
| 238#if D1
|
234 fprintf(stderr, "grepmade\n");
| 239 fprintf(stderr, "grepmade\n");
|
235# endif 236 if (tagout==0) 237 tagout=tgbuff;
| 240#endif 241 if (tagout == 0) 242 tagout = tgbuff;
|
238 grepcall(grepquery, tagout, *fgp);
| 243 grepcall(grepquery, tagout, *fgp);
|
239# if D1
| 244#if D1
|
240 fprintf(stderr, "tagout now /%s/\n", tagout);
| 245 fprintf(stderr, "tagout now /%s/\n", tagout);
|
241# endif 242 if (full) 243 {
| 246#endif 247 if (full) {
|
244 int nout; 245 char *bout; 246 char *tagp; 247 char *oldtagp; 248 tagp = tagout; 249 while (*tagp) { 250 oldtagp = tagp;
| 248 int nout; 249 char *bout; 250 char *tagp; 251 char *oldtagp; 252 tagp = tagout; 253 while (*tagp) { 254 oldtagp = tagp;
|
251 while (*tagp && (*tagp != '\n'))
| 255 while (*tagp && 256 (*tagp != '\n'))
|
252 tagp++;
| 257 tagp++;
|
253 if (*tagp)
| 258 if (*tagp)
|
254 tagp++;
| 259 tagp++;
|
255 nout = findline(oldtagp, &bout, 1000, 0L); 256 if (nout > 0) 257 {
| 260 nout = findline(oldtagp, &bout, 261 1000, 0L); 262 if (nout > 0) {
|
258 fputs(bout, stdout);
| 263 fputs(bout, stdout);
|
259 free(bout);
| 264 free(bout);
|
260 } 261 } 262 } 263 } 264 } 265 if (tags)
| 265 } 266 } 267 } 268 } 269 } 270 if (tags)
|
266 result (master, nfound >tags ? tags: nfound, fc);
| 271 result(master, nfound > tags ? tags : nfound, fc);
|
267 if (measure) tock(); 268 }
| 272 if (measure) tock(); 273 }
|
269 /* NOTREACHED */
| 274 return (0);
|
270} 271 272char *
| 275} 276 277char *
|
273todir(t) 274char *t;
| 278todir(char *t)
|
275{ 276 char *s;
| 279{ 280 char *s;
|
277 s=t;
| 281 s = t;
|
278 while (*s) s++;
| 282 while (*s) s++;
|
279 while (s>=t && *s != '/') s--; 280 if (s<t) return(t);
| 283 while (s >= t && *s != '/') s--; 284 if (s < t) 285 return (t);
|
281 *s++ = 0; 282 t = (*t ? t : "/");
| 286 *s++ = 0; 287 t = (*t ? t : "/");
|
283 chdir (t); 284 strcpy (usedir,t); 285 return(s);
| 288 chdir(t); 289 strcpy(usedir, t); 290 return (s);
|
286}
| 291}
|
287setfrom(c)
| 292 293static int 294setfrom(char c)
|
288{
| 295{
|
289 switch(c) 290 { 291 case 'y':
| 296 switch (c) { 297 case 'y':
|
292 case '\0': 293 default:
| 298 case '\0': 299 default:
|
294 return(1000);
| 300 return (1000);
|
295 case '1':
| 301 case '1':
|
296 case '2': 297 case '3': 298 case '4':
| 302 case '2': 303 case '3': 304 case '4':
|
299 case '5':
| 305 case '5':
|
300 case '6': 301 case '7': 302 case '8':
| 306 case '6': 307 case '7': 308 case '8':
|
303 case '9':
| 309 case '9':
|
304 return(c-'0'); 305 case 'n':
| 310 return (c-'0'); 311 case 'n':
|
306 case '0':
| 312 case '0':
|
307 return(0);
| 313 return (0);
|
308 } 309}
| 314 } 315}
|