xref: /original-bsd/old/refer/inv/inv2.c (revision 2ab53118)
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