libbb/md5: code shrink
authorDenys Vlasenko <dvlasenk@redhat.com>
Fri, 15 Oct 2010 23:08:32 +0000 (01:08 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Fri, 15 Oct 2010 23:08:32 +0000 (01:08 +0200)
function                                             old     new   delta
md5_end                                              123     117      -6
md5_begin                                             49      42      -7
md5_hash                                             119     104     -15

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
include/libbb.h
libbb/md5.c

index 8d7beffe7086d2fd6a32cb415c85f2ffffa75220..034016f4aafd7a059532d5e953383b1be4ccf232 100644 (file)
@@ -1540,7 +1540,6 @@ typedef struct md5_ctx_t {
        uint32_t C;
        uint32_t D;
        uint64_t total;
-       uint32_t buflen;
        char buffer[128];
 } md5_ctx_t;
 #else
index 9e5b496ceefc1c45af8caf71e633957bb6b8db31..1f9d59e6ecb236e63bdb55f30635ff68e5d340c2 100644 (file)
@@ -1,7 +1,7 @@
 /* vi: set sw=4 ts=4: */
 /*
- * md5.c - Compute MD5 checksum of strings according to the
- *         definition of MD5 in RFC 1321 from April 1992.
+ * Compute MD5 checksum of strings according to the
+ * definition of MD5 in RFC 1321 from April 1992.
  *
  * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
  *
@@ -34,7 +34,6 @@ void FAST_FUNC md5_begin(md5_ctx_t *ctx)
        ctx->C = 0x98badcfe;
        ctx->D = 0x10325476;
        ctx->total = 0;
-       ctx->buflen = 0;
 }
 
 /* These are the four functions used in the four steps of the MD5 algorithm
@@ -355,35 +354,39 @@ static void md5_hash_block(const void *buffer, md5_ctx_t *ctx)
        ctx->D = D;
 }
 
+/* The size of filled part of ctx->buffer: */
+#define BUFLEN(ctx) (((unsigned)ctx->total) & 63)
+
 /* Feed data through a temporary buffer to call md5_hash_aligned_block()
  * with chunks of data that are 4-byte aligned and a multiple of 64 bytes.
  * This function's internal buffer remembers previous data until it has 64
  * bytes worth to pass on.  Call md5_end() to flush this buffer. */
 void FAST_FUNC md5_hash(const void *buffer, size_t len, md5_ctx_t *ctx)
 {
-       char *buf = (char *)buffer;
+       const char *buf = buffer;
+       unsigned buflen = BUFLEN(ctx);
 
-       /* RFC 1321 specifies the possible length of the file up to 2^64 bits,
+       /* RFC 1321 specifies the possible length of the file up to 2^64 bits.
         * Here we only track the number of bytes.  */
        ctx->total += len;
 
        /* Process all input. */
-       while (len) {
-               unsigned i = 64 - ctx->buflen;
-
-               /* Copy data into aligned buffer. */
+       while (1) {
+               unsigned i = 64 - buflen;
                if (i > len)
                        i = len;
-               memcpy(ctx->buffer + ctx->buflen, buf, i);
+               /* Copy data into aligned buffer. */
+               memcpy(ctx->buffer + buflen, buf, i);
                len -= i;
-               ctx->buflen += i;
                buf += i;
-
-               /* When buffer fills up, process it. */
-               if (ctx->buflen == 64) {
-                       md5_hash_block(ctx->buffer, ctx);
-                       ctx->buflen = 0;
-               }
+               buflen += i;
+               /* clever way to do "if (buflen != 64) break; ... ; buflen = 0;" */
+               buflen -= 64;
+               if (buflen != 0)
+                       break;
+               /* Buffer is filled up, process it. */
+               md5_hash_block(ctx->buffer, ctx);
+               /*buflen = 0; - already is */
        }
 }
 
@@ -396,18 +399,19 @@ void FAST_FUNC md5_end(void *resbuf, md5_ctx_t *ctx)
 {
        uint64_t total;
        char *buf = ctx->buffer;
-       int i;
+       unsigned i;
+       unsigned buflen = BUFLEN(ctx);
 
        /* Pad data to block size.  */
-       buf[ctx->buflen++] = 0x80;
-       memset(buf + ctx->buflen, 0, 128 - ctx->buflen);
+       buf[buflen++] = 0x80;
+       memset(buf + buflen, 0, 128 - buflen);
 
        /* Put the 64-bit file length, expressed in *bits*,
         * at the end of the buffer.
         */
+       /* clever way to do "if (buflen > 56) buf += 64": */
+       buf += ((buflen + 7) & 64);
        total = ctx->total << 3;
-       if (ctx->buflen > 56)
-               buf += 64;
        for (i = 0; i < 8; i++) {
                buf[56 + i] = total;
                total >>= 8;