# include "stdio.h"
# include "assert.h"
newkeys (outf, inf, recf, nhash, fd, iflong)
	FILE *outf, *inf, *recf, *fd;
	int *iflong;
{
/* reads key lines from inf; hashes and writes on outf; writes orig
   key on recf, records pointer on outf too.
   format of outf is : hash code space record pointer
*/

# define LINESIZ 1250
long lp, ftell();
long ld = 0; int ll = 0, lt = 0;
char line[LINESIZ];
char key[30], bkeys[40];
char *p, *s;
char *keyv[500];
int i, nk, ndoc = 0, more = 0, c;

lp = ftell (recf);
while (fgets(line, LINESIZ, inf))
	{
	p = line;
	while (*p != '\t') p++;
	*p++ =0;
	fputs(line, recf);
	if (fd)
		{
		sprintf(bkeys, ";%ld", ld);
		ll = strlen(p);
		lt = strlen(bkeys);
		fputs(bkeys, recf);
		sprintf(bkeys, ",%d", ll);
		lt += strlen(bkeys);
		fputs(bkeys, recf);
		ld += ll;
		fputs(p, fd);
		}
	putc('\n',recf);
	for(s=p; *s; s++);
	if (*--s == '\n')
		{
		more=0;
		*s=0;
		}
	else
		more=1;
	_assert (fd==0 || more==0);
	nk = getargs(p, keyv);
	if (more)
		nk--;
	for(i=0; i<nk; i++)
		fprintf(outf,"%04d %06ld\n",hash(keyv[i])%nhash, lp);
# if D1
	for(i=0; i<nk; i++)
		printf("key %s hash %d\n",keyv[i],hash(keyv[i])%nhash);
# endif
	if (more) /* allow more than LINESIZ keys */
		{
		strcpy(key, keyv[nk]);
		for(s=key; *s; s++);
		while ( (c=getc(inf)) != '\n')
			{
			if (c != ' ')
				{
				*s++ = c;
				continue;
				}
			*s=0;
			if (s>key)
				fprintf(outf, "%04d %06ld\n",hash(key)%nhash, lp);
			s = key;
			}
		}
	lp += (strlen(line)+lt+1);
	ndoc++;
	}
*iflong = (lp>=65536L);
if (sizeof(int)>2) *iflong=1; /* force long on VAX */
fclose(recf);
return(ndoc);
}
trimnl(p)
	char *p;
{
while (*p) p++;
p--;
if (*p == '\n') *p=0;
}
