summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Čihař <michal@cihar.com>2017-11-14 09:02:03 +0100
committerMichal Čihař <nijel@debian.org>2017-11-17 15:58:22 +0100
commitf1a17dd01ace50175d2d78835e7ed67698c7ac53 (patch)
tree8eddc7b9c6f129ac588fa81eea4e3a9ab2cecb0a
parent4a253fdaf5a464f8f8609ea13c645bd264ebebf2 (diff)
[PATCH] Store integer magic in cache file
This allows to detect different endianity of machines to avoid loading caches created with different endianity. Fixes #36 Signed-off-by: Michal Čihař <michal@cihar.com> Gbp-Pq: Name 0f83f0aa0b8340f2d59bb3a4e174585780a2c54b.patch
-rw-r--r--src/stardict_lib.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/stardict_lib.cpp b/src/stardict_lib.cpp
index 63e23f5..a911ddd 100644
--- a/src/stardict_lib.cpp
+++ b/src/stardict_lib.cpp
@@ -491,7 +491,8 @@ private:
static std::list<std::string> get_cache_variant(const std::string &url);
};
-const char *OffsetIndex::CACHE_MAGIC = "StarDict's Cache, Version: 0.1";
+const char *OffsetIndex::CACHE_MAGIC = "StarDict's Cache, Version: 0.2";
+#define CACHE_MAGIC_BYTES 0x51a4d1c1
class WordListIndex : public IIndexFile
{
@@ -573,7 +574,11 @@ bool OffsetIndex::load_cache(const std::string &url)
continue;
if (strncmp(mf.begin(), CACHE_MAGIC, strlen(CACHE_MAGIC)) != 0)
continue;
- memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC), wordoffset.size() * sizeof(wordoffset[0]));
+ guint32 tmp;
+ memcpy(&tmp, mf.begin() + strlen(CACHE_MAGIC), sizeof(tmp));
+ if (tmp != CACHE_MAGIC_BYTES)
+ continue;
+ memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC) + sizeof(guint32), wordoffset.size() * sizeof(wordoffset[0]));
return true;
}
@@ -605,10 +610,13 @@ bool OffsetIndex::save_cache(const std::string &url, bool verbose)
const std::list<std::string> vars = get_cache_variant(url);
for (const std::string &item : vars) {
FILE *out = fopen(item.c_str(), "wb");
+ guint32 magic = CACHE_MAGIC_BYTES;
if (!out)
continue;
if (fwrite(CACHE_MAGIC, 1, strlen(CACHE_MAGIC), out) != strlen(CACHE_MAGIC))
continue;
+ if (fwrite(&magic, 1, sizeof(magic), out) != sizeof(magic))
+ continue;
if (fwrite(&wordoffset[0], sizeof(wordoffset[0]), wordoffset.size(), out) != wordoffset.size())
continue;
fclose(out);