summaryrefslogtreecommitdiff
path: root/sys/src/cmd/hgfs/hash.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-06-26 07:03:12 +0200
committercinap_lenrek <cinap_lenrek@localhost>2011-06-26 07:03:12 +0200
commitbc1ff6985c03402497a052d2b4e2a299b3cdf218 (patch)
tree92dcfc77cd3fed9adae59994fd4825a7770bead8 /sys/src/cmd/hgfs/hash.c
parent8fa679d04171417d9420b91471cf45e148b4cc50 (diff)
add hgfs, a mercurial filesystem
Diffstat (limited to 'sys/src/cmd/hgfs/hash.c')
-rw-r--r--sys/src/cmd/hgfs/hash.c69
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;
+}