85 lines
1.4 KiB
C
85 lines
1.4 KiB
C
#ifndef lint
|
|
static char sccsid[] = "@(#)inv6.c 1.1 94/10/31 SMI"; /* from UCB 4.2 1/9/85 */
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
|
|
whash(ft, fa, fb, nhash, iflong, ptotct, phused)
|
|
FILE *fa, *fb, *ft;
|
|
int nhash, *phused;
|
|
long *ptotct;
|
|
{
|
|
char line[100];
|
|
int hash = 0, hused = 0;
|
|
long totct = 0L;
|
|
int ct = 0;
|
|
long point;
|
|
long opoint = -1;
|
|
int m;
|
|
int k;
|
|
long lp;
|
|
long *hpt;
|
|
int *hfreq = NULL;
|
|
|
|
hpt = (long *) calloc (nhash+1, sizeof(*hpt));
|
|
_assert (hpt != NULL);
|
|
hfreq = (int *) calloc (nhash, sizeof(*hfreq));
|
|
_assert (hfreq != NULL);
|
|
hpt[0] = 0;
|
|
lp= 0;
|
|
while (fgets(line, 100, ft))
|
|
{
|
|
totct++;
|
|
sscanf(line, "%d %ld", &k, &point);
|
|
if (hash < k)
|
|
{
|
|
hused++;
|
|
if (iflong) putl(-1L, fb);
|
|
else putw(-1, fb);
|
|
hfreq[hash]=ct;
|
|
while (hash<k)
|
|
{
|
|
hpt[++hash] = lp;
|
|
hfreq[hash] = 0;
|
|
}
|
|
hpt[hash] = lp += iflong? sizeof(long) : sizeof(int);
|
|
opoint= -1;
|
|
ct=0;
|
|
}
|
|
if (point!=opoint)
|
|
{
|
|
if (iflong)
|
|
putl(opoint=point, fb);
|
|
else
|
|
putw( (int)(opoint=point), fb);
|
|
lp += iflong? sizeof(long) : sizeof(int);
|
|
ct++;
|
|
}
|
|
}
|
|
if (iflong) putl(-1L, fb);
|
|
else putw(-1,fb);
|
|
while (hash<nhash)
|
|
hpt[++hash]=lp;
|
|
fwrite(&nhash, sizeof(nhash), 1, fa);
|
|
fwrite(&iflong, sizeof(iflong), 1, fa);
|
|
fwrite(hpt, sizeof(*hpt), nhash, fa);
|
|
fwrite (hfreq, sizeof(*hfreq), nhash, fa);
|
|
*ptotct = totct;
|
|
*phused = hused;
|
|
}
|
|
|
|
putl(ll, f)
|
|
long ll;
|
|
FILE *f;
|
|
{
|
|
putw(ll, f);
|
|
}
|
|
|
|
long
|
|
getl(f)
|
|
FILE *f;
|
|
{
|
|
return(getw(f));
|
|
}
|