aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/archive.cc26
-rw-r--r--src/archive.h19
-rw-r--r--src/index.cc4
3 files changed, 48 insertions, 1 deletions
diff --git a/src/archive.cc b/src/archive.cc
new file mode 100644
index 0000000..6a97bdf
--- /dev/null
+++ b/src/archive.cc
@@ -0,0 +1,26 @@
+#include "archive.h"
+
+#include "istream/stream.h"
+
+namespace dictzip {
+
+ArchiveFile::ArchiveFile(const std::string& path):
+ path_(path) { }
+
+std::string ArchiveFile::get(std::size_t offset, std::size_t length) const {
+ Istream stream(this->path_.c_str());
+
+ std::string result;
+ result.resize(length);
+
+ stream.seekg(offset);
+ stream.read(&result[0], length);
+
+ return result;
+}
+
+std::string ArchiveFile::get(const IndexFile::Entry& entry) const {
+ return this->get(entry.offset, entry.length);
+}
+
+}
diff --git a/src/archive.h b/src/archive.h
new file mode 100644
index 0000000..fcf19b7
--- /dev/null
+++ b/src/archive.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "index.h"
+
+namespace dictzip {
+
+class ArchiveFile {
+public:
+ ArchiveFile(const std::string& path);
+
+ std::string get(std::size_t offset, std::size_t length) const;
+ std::string get(const IndexFile::Entry& entry) const;
+
+private:
+ const std::string path_;
+
+};
+
+}
diff --git a/src/index.cc b/src/index.cc
index c8dc6de..b22ae05 100644
--- a/src/index.cc
+++ b/src/index.cc
@@ -5,7 +5,6 @@
#include <algorithm>
-
namespace dictzip {
IndexFile::Entry parse_from_line(const std::string& line) {
@@ -13,8 +12,11 @@ IndexFile::Entry parse_from_line(const std::string& line) {
const std::size_t end = line.find_last_of('\t');
return IndexFile::Entry(
+ // word
line.substr(0, start),
+ // offset
base64_decode(line.substr(start + 1, end - (start + 1))),
+ // length
base64_decode(line.substr(end + 1)));
}