1*2ab53118Sbostic /*-
2*2ab53118Sbostic * %sccs.include.proprietary.c%
3*2ab53118Sbostic */
4*2ab53118Sbostic
53363a8a3Stut #ifndef lint
6*2ab53118Sbostic static char sccsid[] = "@(#)inv2.c 4.2 (Berkeley) 04/18/91";
7*2ab53118Sbostic #endif /* not lint */
83363a8a3Stut
93363a8a3Stut #include <stdio.h>
103363a8a3Stut #include <assert.h>
113363a8a3Stut #define LINESIZ 1250
123363a8a3Stut
newkeys(outf,inf,recf,nhash,fd,iflong)133363a8a3Stut newkeys (outf, inf, recf, nhash, fd, iflong)
143363a8a3Stut FILE *outf, *inf, *recf, *fd;
153363a8a3Stut int *iflong;
163363a8a3Stut {
173363a8a3Stut /* reads key lines from inf; hashes and writes on outf;
183363a8a3Stut * writes orig key on recf, records pointer on outf too.
193363a8a3Stut * format of outf is : hash code space record pointer
203363a8a3Stut */
213363a8a3Stut
223363a8a3Stut long lp, ftell();
233363a8a3Stut long ld = 0;
243363a8a3Stut int ll = 0, lt = 0;
253363a8a3Stut char line[LINESIZ];
263363a8a3Stut char key[30], bkeys[40];
273363a8a3Stut char *p, *s;
283363a8a3Stut char *keyv[500];
293363a8a3Stut int i, nk, ndoc = 0, more = 0, c;
303363a8a3Stut
313363a8a3Stut lp = ftell (recf);
323363a8a3Stut while (fgets(line, LINESIZ, inf))
333363a8a3Stut {
343363a8a3Stut p = line;
353363a8a3Stut while (*p != '\t') p++;
363363a8a3Stut *p++ =0;
373363a8a3Stut fputs(line, recf);
383363a8a3Stut if (fd)
393363a8a3Stut {
403363a8a3Stut sprintf(bkeys, ";%ld", ld);
413363a8a3Stut ll = strlen(p);
423363a8a3Stut lt = strlen(bkeys);
433363a8a3Stut fputs(bkeys, recf);
443363a8a3Stut sprintf(bkeys, ",%d", ll);
453363a8a3Stut lt += strlen(bkeys);
463363a8a3Stut fputs(bkeys, recf);
473363a8a3Stut ld += ll;
483363a8a3Stut fputs(p, fd);
493363a8a3Stut }
503363a8a3Stut putc('\n',recf);
513363a8a3Stut for(s=p; *s; s++);
523363a8a3Stut if (*--s == '\n')
533363a8a3Stut {
543363a8a3Stut more=0;
553363a8a3Stut *s=0;
563363a8a3Stut }
573363a8a3Stut else
583363a8a3Stut more=1;
593363a8a3Stut _assert (fd==0 || more==0);
603363a8a3Stut nk = getargs(p, keyv);
613363a8a3Stut if (more)
623363a8a3Stut nk--;
633363a8a3Stut for(i=0; i<nk; i++)
643363a8a3Stut fprintf(outf,"%04d %06ld\n",hash(keyv[i])%nhash, lp);
653363a8a3Stut # if D1
663363a8a3Stut for(i=0; i<nk; i++)
673363a8a3Stut printf("key %s hash %d\n",keyv[i],hash(keyv[i])%nhash);
683363a8a3Stut # endif
693363a8a3Stut if (more) /* allow more than LINESIZ keys */
703363a8a3Stut {
713363a8a3Stut strcpy(key, keyv[nk]);
723363a8a3Stut for(s=key; *s; s++);
733363a8a3Stut while ( (c=getc(inf)) != '\n')
743363a8a3Stut {
753363a8a3Stut if (c != ' ')
763363a8a3Stut {
773363a8a3Stut *s++ = c;
783363a8a3Stut continue;
793363a8a3Stut }
803363a8a3Stut *s=0;
813363a8a3Stut if (s>key)
823363a8a3Stut fprintf(outf, "%04d %06ld\n",hash(key)%nhash, lp);
833363a8a3Stut s = key;
843363a8a3Stut }
853363a8a3Stut }
863363a8a3Stut lp += (strlen(line)+lt+1);
873363a8a3Stut ndoc++;
883363a8a3Stut }
893363a8a3Stut *iflong = (lp>=65536L);
903363a8a3Stut if (sizeof(int)>2) *iflong=1; /* force long on VAX */
913363a8a3Stut fclose(recf);
923363a8a3Stut return(ndoc);
933363a8a3Stut }
943363a8a3Stut
trimnl(p)953363a8a3Stut trimnl(p)
963363a8a3Stut char *p;
973363a8a3Stut {
983363a8a3Stut while (*p) p++;
993363a8a3Stut p--;
1003363a8a3Stut if (*p == '\n') *p=0;
1013363a8a3Stut }
102