summaryrefslogtreecommitdiff
path: root/src/fchash.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2014-05-16 14:17:45 -0600
committerBehdad Esfahbod <behdad@behdad.org>2014-05-16 14:23:56 -0600
commit8284df49ef45678781fc6e05d18cc04acf04cf3c (patch)
tree127a86d3501d9c8d958506c50cd60e122c085d38 /src/fchash.c
parent748e77e89f8f6ba297ce9d206ac3834ae087201d (diff)
downloadfontconfig-8284df49ef45678781fc6e05d18cc04acf04cf3c.tar.gz
Further simplify hash code
Diffstat (limited to 'src/fchash.c')
-rw-r--r--src/fchash.c88
1 files changed, 38 insertions, 50 deletions
diff --git a/src/fchash.c b/src/fchash.c
index 66e73f0..3fc51f7 100644
--- a/src/fchash.c
+++ b/src/fchash.c
@@ -129,6 +129,41 @@ FcHashDigestAddBlock (FcHashDigest digest,
#undef H
}
+static void
+FcHashDigestFinish (FcHashDigest digest,
+ const char *residual, /* < 64 bytes */
+ size_t total_len)
+{
+ char ibuf[64];
+ unsigned int len = total_len % 64;
+ uint64_t v;
+
+ if (!len)
+ return;
+
+ memcpy (ibuf, residual, len);
+ memset (ibuf + len, 0, 64 - len);
+ ibuf[len] = 0x80;
+
+ if ((64 - len) < 9)
+ {
+ FcHashDigestAddBlock (digest, ibuf);
+ memset (ibuf, 0, 64);
+ }
+
+ /* set input size at the end */
+ v = (uint64_t) total_len * 8;
+ ibuf[63 - 0] = v & 0xff;
+ ibuf[63 - 1] = (v >> 8) & 0xff;
+ ibuf[63 - 2] = (v >> 16) & 0xff;
+ ibuf[63 - 3] = (v >> 24) & 0xff;
+ ibuf[63 - 4] = (v >> 32) & 0xff;
+ ibuf[63 - 5] = (v >> 40) & 0xff;
+ ibuf[63 - 6] = (v >> 48) & 0xff;
+ ibuf[63 - 7] = (v >> 56) & 0xff;
+ FcHashDigestAddBlock (digest, ibuf);
+}
+
static FcChar8 *
FcHashToString (const FcHashDigest digest)
{
@@ -176,28 +211,7 @@ FcHashGetDigestFromFile (const FcChar8 *filename)
{
if ((len = fread (ibuf, sizeof (char), 64, fp)) < 64)
{
- uint64_t v;
-
- /* add a padding */
- memset (&ibuf[len], 0, 64 - len);
- ibuf[len] = 0x80;
- if ((64 - len) < 9)
- {
- /* process a block once */
- FcHashDigestAddBlock (digest, ibuf);
- memset (ibuf, 0, 64);
- }
- /* set input size at the end */
- v = (long)st.st_size * 8;
- ibuf[63 - 0] = v & 0xff;
- ibuf[63 - 1] = (v >> 8) & 0xff;
- ibuf[63 - 2] = (v >> 16) & 0xff;
- ibuf[63 - 3] = (v >> 24) & 0xff;
- ibuf[63 - 4] = (v >> 32) & 0xff;
- ibuf[63 - 5] = (v >> 40) & 0xff;
- ibuf[63 - 6] = (v >> 48) & 0xff;
- ibuf[63 - 7] = (v >> 56) & 0xff;
- FcHashDigestAddBlock (digest, ibuf);
+ FcHashDigestFinish (digest, ibuf, st.st_size);
break;
}
else
@@ -217,10 +231,9 @@ bail0:
FcChar8 *
FcHashGetDigestFromMemory (const char *fontdata,
- size_t length)
+ size_t length)
{
FcHashDigest digest;
- char ibuf[64];
size_t i = 0;
FcHashInitDigest (digest);
@@ -229,32 +242,7 @@ FcHashGetDigestFromMemory (const char *fontdata,
{
if ((length - i) < 64)
{
- uint64_t v;
- size_t n;
-
- /* add a padding */
- n = length - i;
- if (n > 0)
- memcpy (ibuf, &fontdata[i], n);
- memset (&ibuf[n], 0, 64 - n);
- ibuf[n] = 0x80;
- if ((64 - n) < 9)
- {
- /* process a block once */
- FcHashDigestAddBlock (digest, ibuf);
- memset (ibuf, 0, 64);
- }
- /* set input size at the end */
- v = length * 8;
- ibuf[63 - 0] = v & 0xff;
- ibuf[63 - 1] = (v >> 8) & 0xff;
- ibuf[63 - 2] = (v >> 16) & 0xff;
- ibuf[63 - 3] = (v >> 24) & 0xff;
- ibuf[63 - 4] = (v >> 32) & 0xff;
- ibuf[63 - 5] = (v >> 40) & 0xff;
- ibuf[63 - 6] = (v >> 48) & 0xff;
- ibuf[63 - 7] = (v >> 56) & 0xff;
- FcHashDigestAddBlock (digest, ibuf);
+ FcHashDigestFinish (digest, fontdata+i, length);
break;
}
else