]> git.proxmox.com Git - libgit2.git/blobdiff - src/hash.c
New upstream version 1.3.0+dfsg.1
[libgit2.git] / src / hash.c
index 4607569138b70b3dd53943942f0e6523e8180e86..5a7278e4225673a9f615dc6fa2144a811eaf82eb 100644 (file)
 /*
- * Copyright (C) 2009-2012 the libgit2 contributors
+ * Copyright (C) the libgit2 contributors. All rights reserved.
  *
  * This file is part of libgit2, distributed under the GNU GPL v2 with
  * a Linking Exception. For full terms see the included COPYING file.
  */
 
-#include "common.h"
 #include "hash.h"
 
-#if defined(PPC_SHA1)
-# include "ppc/sha1.h"
-#else
-# include "sha1.h"
-#endif
-
-struct git_hash_ctx {
-       SHA_CTX c;
-};
+int git_hash_global_init(void)
+{
+       return git_hash_sha1_global_init();
+}
 
-git_hash_ctx *git_hash_new_ctx(void)
+int git_hash_ctx_init(git_hash_ctx *ctx)
 {
-       git_hash_ctx *ctx = git__malloc(sizeof(*ctx));
+       int error;
 
-       if (!ctx)
-               return NULL;
+       if ((error = git_hash_sha1_ctx_init(&ctx->ctx.sha1)) < 0)
+               return error;
 
-       SHA1_Init(&ctx->c);
+       ctx->algo = GIT_HASH_ALGO_SHA1;
 
-       return ctx;
+       return 0;
 }
 
-void git_hash_free_ctx(git_hash_ctx *ctx)
+void git_hash_ctx_cleanup(git_hash_ctx *ctx)
 {
-       git__free(ctx);
+       switch (ctx->algo) {
+               case GIT_HASH_ALGO_SHA1:
+                       git_hash_sha1_ctx_cleanup(&ctx->ctx.sha1);
+                       return;
+               default:
+                       /* unreachable */ ;
+       }
 }
 
-void git_hash_init(git_hash_ctx *ctx)
+int git_hash_init(git_hash_ctx *ctx)
 {
-       assert(ctx);
-       SHA1_Init(&ctx->c);
+       switch (ctx->algo) {
+               case GIT_HASH_ALGO_SHA1:
+                       return git_hash_sha1_init(&ctx->ctx.sha1);
+               default:
+                       /* unreachable */ ;
+       }
+       GIT_ASSERT(0);
+       return -1;
 }
 
-void git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
+int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
 {
-       assert(ctx);
-       SHA1_Update(&ctx->c, data, len);
+       switch (ctx->algo) {
+               case GIT_HASH_ALGO_SHA1:
+                       return git_hash_sha1_update(&ctx->ctx.sha1, data, len);
+               default:
+                       /* unreachable */ ;
+       }
+       GIT_ASSERT(0);
+       return -1;
 }
 
-void git_hash_final(git_oid *out, git_hash_ctx *ctx)
+int git_hash_final(git_oid *out, git_hash_ctx *ctx)
 {
-       assert(ctx);
-       SHA1_Final(out->id, &ctx->c);
+       switch (ctx->algo) {
+               case GIT_HASH_ALGO_SHA1:
+                       return git_hash_sha1_final(out, &ctx->ctx.sha1);
+               default:
+                       /* unreachable */ ;
+       }
+       GIT_ASSERT(0);
+       return -1;
 }
 
-void git_hash_buf(git_oid *out, const void *data, size_t len)
+int git_hash_buf(git_oid *out, const void *data, size_t len)
 {
-       SHA_CTX c;
+       git_hash_ctx ctx;
+       int error = 0;
+
+       if (git_hash_ctx_init(&ctx) < 0)
+               return -1;
+
+       if ((error = git_hash_update(&ctx, data, len)) >= 0)
+               error = git_hash_final(out, &ctx);
 
-       SHA1_Init(&c);
-       SHA1_Update(&c, data, len);
-       SHA1_Final(out->id, &c);
+       git_hash_ctx_cleanup(&ctx);
+
+       return error;
 }
 
-void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
+int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
 {
-       SHA_CTX c;
+       git_hash_ctx ctx;
        size_t i;
+       int error = 0;
+
+       if (git_hash_ctx_init(&ctx) < 0)
+               return -1;
+
+       for (i = 0; i < n; i++) {
+               if ((error = git_hash_update(&ctx, vec[i].data, vec[i].len)) < 0)
+                       goto done;
+       }
+
+       error = git_hash_final(out, &ctx);
+
+done:
+       git_hash_ctx_cleanup(&ctx);
 
-       SHA1_Init(&c);
-       for (i = 0; i < n; i++)
-               SHA1_Update(&c, vec[i].data, vec[i].len);
-       SHA1_Final(out->id, &c);
+       return error;
 }