summaryrefslogtreecommitdiff
path: root/lexiconparameters.cpp
diff options
context:
space:
mode:
authorJohn Fultz <jfultz@wolfram.com>2015-08-24 04:45:27 -0500
committerJohn Fultz <jfultz@wolfram.com>2015-08-24 04:45:46 -0500
commit1f7b8ef6f96e1d5a2c50565a0f52cc633215e485 (patch)
tree11f406677824d20924748225ab7eb129ba929cd0 /lexiconparameters.cpp
parent8c7ffef1b6c669592e979fb6038dd634df7f95fc (diff)
Version the GADDAGs.
Basically the same thing I just did to the DAWG files, now done to GADDAGs. Also, add hashing, and make sure GADDAGs only load if their hash matches that of the DAWG files.
Diffstat (limited to 'lexiconparameters.cpp')
-rw-r--r--lexiconparameters.cpp52
1 files changed, 40 insertions, 12 deletions
diff --git a/lexiconparameters.cpp b/lexiconparameters.cpp
index ca09fa5..e014048 100644
--- a/lexiconparameters.cpp
+++ b/lexiconparameters.cpp
@@ -19,13 +19,14 @@
#include <iostream>
#include <fstream>
+
#include "datamanager.h"
#include "lexiconparameters.h"
#include "uv.h"
using namespace Quackle;
-class Quackle::V0DawgInterpreter : public DawgInterpreter
+class Quackle::V0LexiconInterpreter : public LexiconInterpreter
{
virtual void loadDawg(ifstream &file, LexiconParameters &lexparams)
@@ -39,6 +40,17 @@ class Quackle::V0DawgInterpreter : public DawgInterpreter
}
}
+ virtual void loadGaddag(ifstream &file, LexiconParameters &lexparams)
+ {
+ int i = 0;
+ file.unget();
+ while (!file.eof())
+ {
+ file.read((char*)(lexparams.m_gaddag) + i, 4);
+ i += 4;
+ }
+ }
+
virtual void dawgAt(const unsigned char *dawg, int index, unsigned int &p, Letter &letter, bool &t, bool &lastchild, bool &british, int &playability) const
{
index *= 7;
@@ -55,7 +67,7 @@ class Quackle::V0DawgInterpreter : public DawgInterpreter
virtual int versionNumber() const { return 0; }
};
-class Quackle::V1DawgInterpreter : public DawgInterpreter
+class Quackle::V1LexiconInterpreter : public LexiconInterpreter
{
virtual void loadDawg(ifstream &file, LexiconParameters &lexparams)
@@ -72,6 +84,24 @@ class Quackle::V1DawgInterpreter : public DawgInterpreter
}
}
+ virtual void loadGaddag(ifstream &file, LexiconParameters &lexparams)
+ {
+ char hash[16];
+ file.read(hash, sizeof(hash));
+ if (memcmp(hash, lexparams.m_hash, sizeof(hash)))
+ {
+ lexparams.unloadGaddag(); // don't use a mismatched gaddag
+ return;
+ }
+
+ int i = 0;
+ while (!file.eof())
+ {
+ file.read((char*)(lexparams.m_gaddag) + i, 4);
+ i += 4;
+ }
+ }
+
virtual void dawgAt(const unsigned char *dawg, int index, unsigned int &p, Letter &letter, bool &t, bool &lastchild, bool &british, int &playability) const
{
index *= 7;
@@ -108,14 +138,14 @@ void LexiconParameters::unloadAll()
void LexiconParameters::unloadDawg()
{
delete[] m_dawg;
- m_dawg = 0;
+ m_dawg = NULL;
delete m_interpreter;
}
void LexiconParameters::unloadGaddag()
{
delete[] m_gaddag;
- m_gaddag = 0;
+ m_gaddag = NULL;
}
void LexiconParameters::loadDawg(const string &filename)
@@ -133,10 +163,10 @@ void LexiconParameters::loadDawg(const string &filename)
switch(versionByte)
{
case 0:
- m_interpreter = new V0DawgInterpreter();
+ m_interpreter = new V0LexiconInterpreter();
break;
case 1:
- m_interpreter = new V1DawgInterpreter();
+ m_interpreter = new V1LexiconInterpreter();
break;
default:
UVcout << "couldn't open dawg " << filename.c_str() << endl;
@@ -160,14 +190,12 @@ void LexiconParameters::loadGaddag(const string &filename)
return;
}
+ char versionByte = file.get();
+ if (versionByte != m_interpreter->versionNumber())
+ return;
m_gaddag = new unsigned char[40000000];
- int i = 0;
- while (!file.eof())
- {
- file.read((char*)(m_gaddag) + i, 4);
- i += 4;
- }
+ m_interpreter->loadGaddag(file, *this);
}
string LexiconParameters::findDictionaryFile(const string &lexicon)