summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/hash.h')
-rw-r--r--src/lib/util/hash.h122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/lib/util/hash.h b/src/lib/util/hash.h
new file mode 100644
index 00000000000..ec628a949f2
--- /dev/null
+++ b/src/lib/util/hash.h
@@ -0,0 +1,122 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/***************************************************************************
+
+ hash.h
+
+ Function to handle hash functions (checksums)
+
+ Based on original idea by Farfetch'd
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __HASH_H__
+#define __HASH_H__
+
+#include "hashing.h"
+
+
+//**************************************************************************
+// MACROS
+//**************************************************************************
+
+// use these to define compile-time internal-format hash strings
+#define CRC(x) "R" #x
+#define SHA1(x) "S" #x
+#define NO_DUMP "!"
+#define BAD_DUMP "^"
+
+
+namespace util {
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+
+// ======================> hash_collection
+
+// a collection of the various supported hashes and flags
+class hash_collection
+{
+public:
+ // hash types are identified by non-hex alpha values (G-Z)
+ static constexpr char HASH_CRC = 'R';
+ static constexpr char HASH_SHA1 = 'S';
+
+ // common combinations for requests
+ static const char *HASH_TYPES_CRC;
+ static const char *HASH_TYPES_CRC_SHA1;
+ static const char *HASH_TYPES_ALL;
+
+ // flags are identified by punctuation marks
+ static constexpr char FLAG_NO_DUMP = '!';
+ static constexpr char FLAG_BAD_DUMP = '^';
+
+ // construction/destruction
+ hash_collection();
+ hash_collection(const char *string);
+ hash_collection(const hash_collection &src);
+ ~hash_collection();
+
+ // operators
+ hash_collection &operator=(const hash_collection &src);
+ bool operator==(const hash_collection &rhs) const;
+ bool operator!=(const hash_collection &rhs) const { return !(*this == rhs); }
+
+ // getters
+ bool flag(char flag) const { return (m_flags.find_first_of(flag) != std::string::npos); }
+ std::string hash_types() const;
+
+ // hash manipulators
+ void reset();
+ bool add_from_string(char type, const char *buffer, int length = -1);
+ bool remove(char type);
+
+ // CRC-specific helpers
+ bool crc(UINT32 &result) const { result = m_crc32; return m_has_crc32; }
+ void add_crc(UINT32 crc) { m_crc32 = crc; m_has_crc32 = true; }
+
+ // SHA1-specific helpers
+ bool sha1(sha1_t &result) const { result = m_sha1; return m_has_sha1; }
+ void add_sha1(sha1_t sha1) { m_has_sha1 = true; m_sha1 = sha1; }
+
+ // string conversion
+ std::string internal_string() const;
+ std::string macro_string() const;
+ std::string attribute_string() const;
+ bool from_internal_string(const char *string);
+
+ // creation
+ void begin(const char *types = nullptr);
+ void buffer(const UINT8 *data, UINT32 length);
+ void end();
+ void compute(const UINT8 *data, UINT32 length, const char *types = nullptr) { begin(types); buffer(data, length); end(); }
+
+private:
+ // internal helpers
+ void copyfrom(const hash_collection &src);
+
+ // internal state
+ std::string m_flags;
+ bool m_has_crc32;
+ crc32_t m_crc32;
+ bool m_has_sha1;
+ sha1_t m_sha1;
+
+ // creators
+ struct hash_creator
+ {
+ bool m_doing_crc32;
+ crc32_creator m_crc32_creator;
+ bool m_doing_sha1;
+ sha1_creator m_sha1_creator;
+ };
+ hash_creator * m_creator;
+};
+
+
+} // namespace util
+
+#endif /* __HASH_H__ */