forked from googleprojectzero/Jackalope
-
Notifications
You must be signed in to change notification settings - Fork 1
/
sample.h
96 lines (66 loc) · 2.02 KB
/
sample.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
Copyright 2020 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include <stdio.h>
#include <unordered_map>
#include <string>
#include "mutex.h"
#define DEFAULT_MAX_SAMPLE_SIZE 1000000
class Sample {
public:
char *bytes;
size_t size;
std::string filename;
Sample();
~Sample();
Sample(const Sample &in);
Sample& operator= (const Sample &in);
void Clear();
int Save(const char * filename);
int Save();
int Load();
void FreeMemory();
void EnsureLoaded();
void Save(FILE * fp);
int Load(const char * filename);
void Init(const char *data, size_t size);
void Init(size_t size);
void Append(char *data, size_t size);
void Trim(size_t new_size);
void Resize(size_t new_size);
void Crop(size_t from, size_t to, Sample* out);
size_t FindFirstDiff(Sample &other);
static size_t max_size;
};
// a Trie-like structure whose purpose is to be able to
// quickly identify the first byte of a sample
// that differs from the samples seen so far
class SampleTrie {
public:
SampleTrie() {
root = NULL;
}
size_t AddSample(Sample *sample);
protected:
struct SampleTrieNode {
SampleTrieNode();
~SampleTrieNode();
void InitConstantPart(Sample *sample, size_t from, size_t to);
char *constant_part;
size_t constant_part_size;
std::unordered_map<unsigned char, SampleTrieNode*> children;
bool leaf;
};
static Mutex sample_trie_mutex;
SampleTrieNode *root;
};