#include "inv.h"
int newkeys(FILE *outf, FILE *inf, FILE *recf, int nhash, FILE *fd)
{
/* 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
*/
long lp;
long ld = 0;
int ll, lt = 0;
char bkeys[40];
char *p, *line;
int i, ndoc = 0;
static Alist keyv;
lp = ftell(recf);
while ((line = getln(inf)) != 0) {
if ((p = strchr(line, '\t')) != 0)
*p++ = '\0';
else
err("wrong input format for inv");
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);
getargs(p, &keyv);
for (i = 0; i < keyv.n; i++)
fprintf(outf, "%.5d %.9ld\n", hash(keyv.lp[i]) % nhash, lp);
# if D1
for (i = 0; i < keyv.n; i++)
printf("key %s hash %d offs %ld\n", keyv.lp[i], hash(keyv.lp[i]) % nhash, lp);
# endif
lp += (strlen(line) + lt + 1);
ndoc++;
}
fclose(recf);
return ndoc;
}
|