File: hash.c

package info (click to toggle)
tra 20020816-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 1,696 kB
  • ctags: 2,623
  • sloc: ansic: 22,519; makefile: 406; asm: 269
file content (62 lines) | stat: -rw-r--r-- 853 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "tra.h"

Hashlist*
mkhashlist(void)
{
	Hashlist *hl;

	hl = emalloc(sizeof(Hashlist));
	hl->nh = 0;
	hl->h = (Hash*)&hl[1];
	return hl;
}

Hashlist*
addhash(Hashlist *hl, uchar *sha1, vlong off, vlong n)
{
	Hash *h;

	if(hl->nh%256 == 0){
		hl = erealloc(hl, sizeof(Hashlist)+(hl->nh+256)*sizeof(Hash));
		hl->h = (Hash*)&hl[1];
	}
	h = &hl->h[hl->nh++];
	memmove(h->sha1, sha1, SHA1dlen);
	h->off = off;
	h->n = n;
	return hl;
}

int
hashcmp(const void *va, const void *vb)
{
	Hash *a, *b;

	a = (Hash*)va;
	b = (Hash*)vb;
	return memcmp(a->sha1, b->sha1, sizeof a->sha1);
}

Hash*
findhash(Hashlist *hl, uchar *p)
{
	int i;
	Hash *h;
	int n;

	h = hl->h;
	n = hl->nh;

	while(n > 0){
		i = memcmp(p, h[n/2].sha1, SHA1dlen);
		if(i < 0)
			n = n/2;
		else if(i > 0){
			h += n/2+1;
			n -= n/2+1;
		}else
			return &h[n/2];
	}
	return nil;
}