diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-06-26 07:03:12 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-06-26 07:03:12 +0200 |
commit | bc1ff6985c03402497a052d2b4e2a299b3cdf218 (patch) | |
tree | 92dcfc77cd3fed9adae59994fd4825a7770bead8 /sys/src/cmd/hgfs/hash.c | |
parent | 8fa679d04171417d9420b91471cf45e148b4cc50 (diff) |
add hgfs, a mercurial filesystem
Diffstat (limited to 'sys/src/cmd/hgfs/hash.c')
-rw-r--r-- | sys/src/cmd/hgfs/hash.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/sys/src/cmd/hgfs/hash.c b/sys/src/cmd/hgfs/hash.c new file mode 100644 index 000000000..768e35759 --- /dev/null +++ b/sys/src/cmd/hgfs/hash.c @@ -0,0 +1,69 @@ +#include <u.h> +#include <libc.h> +#include <thread.h> +#include "dat.h" +#include "fns.h" + +#include <mp.h> +#include <libsec.h> + +int +Hfmt(Fmt *f) +{ + uchar *p; + + p = va_arg(f->args, uchar*); + return fmtprint(f, + "%.2x%.2x%.2x%.2x%.2x%.2x", + p[0], p[1], p[2], p[3], p[4], p[5]); +} + +int +fhash(int fd, uchar p1[], uchar p2[], uchar h[]) +{ + DigestState *ds; + uchar buf[BUFSZ]; + int n; + + ds = nil; + memset(h, 0, HASHSZ); + if(memcmp(p1, p2, HASHSZ) > 0){ + ds = sha1(p2, HASHSZ, nil, ds); + sha1(p1, HASHSZ, nil, ds); + } else { + ds = sha1(p1, HASHSZ, nil, ds); + sha1(p2, HASHSZ, nil, ds); + } + while((n = read(fd, buf, BUFSZ)) > 0) + sha1(buf, n, nil, ds); + sha1(buf, 0, h, ds); + + return 0; +} + +int +strhash(char *s, uchar *h) +{ + uchar *b; + int n; + + b = h; + memset(h, 0, HASHSZ); + n = HASHSZ*2; + while(*s && n > 0){ + if(*s >= '0' && *s <= '9') + *h |= *s - '0'; + else if(*s >= 'a' && *s <= 'f') + *h |= 10 + *s - 'a'; + else if(*s >= 'A' && *s <= 'F') + *h |= 10 + *s - 'A'; + else + break; + if(n-- & 1) + h++; + else + *h <<= 4; + s++; + } + return h - b; +} |