h44893
s 00081/00000/00000
d D 1.1 82/08/02 15:56:31 cecily 1 0
e
u
U
t
T
I 1
# 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 = calloc (nhash+1, sizeof(*hpt));
_assert (hpt != NULL);
hfreq = 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;
{
int *x;
x = &ll;
putw(x[0], f);
putw(x[1], f);
}
long getl(f)
	FILE *f;
{
int x[2];
int *ll;
x[0] = getw(f);
x[1] = getw(f);
ll = x;
return (*ll);
}
E 1
