Coverage Report

Created: 2024-02-25 07:19

/src/libmodi/libfmos/libfmos_lzvn.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * LZVN (un)compression functions
3
 *
4
 * Copyright (C) 2019-2024, Joachim Metz <joachim.metz@gmail.com>
5
 *
6
 * Refer to AUTHORS for acknowledgements.
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU Lesser General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public License
19
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20
 */
21
22
#include <common.h>
23
#include <memory.h>
24
#include <types.h>
25
26
#include "libfmos_libcerror.h"
27
#include "libfmos_libcnotify.h"
28
#include "libfmos_lzvn.h"
29
30
enum LIBFMOS_LZVN_OPPCODE_TYPES
31
{
32
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE,
33
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,
34
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,
35
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL,
36
  LIBFMOS_LZVN_OPPCODE_TYPE_END_OF_STREAM,
37
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,
38
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_LARGE,
39
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,
40
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_LARGE,
41
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,
42
  LIBFMOS_LZVN_OPPCODE_TYPE_NONE,
43
};
44
45
/* Lookup table to map an oppcode to its type
46
 */
47
uint8_t libfmos_lzvn_oppcode_types[ 256 ] = {
48
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x00 */
49
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x01 */
50
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x02 */
51
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x03 */
52
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x04 */
53
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x05 */
54
  LIBFMOS_LZVN_OPPCODE_TYPE_END_OF_STREAM,  /* 0x06 */
55
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x07 */
56
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x08 */
57
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x09 */
58
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x0a */
59
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x0b */
60
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x0c */
61
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x0d */
62
  LIBFMOS_LZVN_OPPCODE_TYPE_NONE,     /* 0x0e */
63
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x0f */
64
65
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x10 */
66
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x11 */
67
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x12 */
68
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x13 */
69
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x14 */
70
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x15 */
71
  LIBFMOS_LZVN_OPPCODE_TYPE_NONE,     /* 0x16 */
72
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x17 */
73
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x18 */
74
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x19 */
75
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x1a */
76
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x1b */
77
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x1c */
78
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x1d */
79
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x1e */
80
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x1f */
81
82
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x20 */
83
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x21 */
84
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x22 */
85
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x23 */
86
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x24 */
87
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x25 */
88
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x26 */
89
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x27 */
90
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x28 */
91
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x29 */
92
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x2a */
93
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x2b */
94
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x2c */
95
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x2d */
96
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x2e */
97
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x2f */
98
99
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x30 */
100
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x31 */
101
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x32 */
102
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x33 */
103
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x34 */
104
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x35 */
105
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x36 */
106
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x37 */
107
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x38 */
108
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x39 */
109
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x3a */
110
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x3b */
111
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x3c */
112
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x3d */
113
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x3e */
114
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x3f */
115
116
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x40 */
117
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x41 */
118
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x42 */
119
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x43 */
120
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x44 */
121
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x45 */
122
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x46 */
123
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x47 */
124
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x48 */
125
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x49 */
126
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x4a */
127
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x4b */
128
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x4c */
129
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x4d */
130
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x4e */
131
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x4f */
132
133
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x50 */
134
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x51 */
135
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x52 */
136
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x53 */
137
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x54 */
138
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x55 */
139
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x56 */
140
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x57 */
141
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x58 */
142
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x59 */
143
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x5a */
144
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x5b */
145
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x5c */
146
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x5d */
147
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x5e */
148
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x5f */
149
150
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x60 */
151
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x61 */
152
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x62 */
153
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x63 */
154
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x64 */
155
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x65 */
156
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x66 */
157
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x67 */
158
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x68 */
159
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x69 */
160
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x6a */
161
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x6b */
162
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x6c */
163
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x6d */
164
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x6e */
165
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x6f */
166
167
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x70 */
168
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x71 */
169
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x72 */
170
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x73 */
171
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x74 */
172
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x75 */
173
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x76 */
174
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x77 */
175
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x78 */
176
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x79 */
177
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x7a */
178
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x7b */
179
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x7c */
180
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x7d */
181
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x7e */
182
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0x7f */
183
184
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x80 */
185
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x81 */
186
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x82 */
187
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x83 */
188
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x84 */
189
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x85 */
190
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x86 */
191
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x87 */
192
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x88 */
193
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x89 */
194
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x8a */
195
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x8b */
196
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x8c */
197
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x8d */
198
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x8e */
199
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x8f */
200
201
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x90 */
202
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x91 */
203
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x92 */
204
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x93 */
205
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x94 */
206
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x95 */
207
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x96 */
208
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x97 */
209
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x98 */
210
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x99 */
211
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x9a */
212
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x9b */
213
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x9c */
214
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0x9d */
215
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0x9e */
216
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0x9f */
217
218
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa0 */
219
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa1 */
220
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa2 */
221
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa3 */
222
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa4 */
223
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa5 */
224
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa6 */
225
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa7 */
226
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa8 */
227
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xa9 */
228
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xaa */
229
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xab */
230
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xac */
231
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xad */
232
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xae */
233
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xaf */
234
235
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb0 */
236
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb1 */
237
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb2 */
238
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb3 */
239
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb4 */
240
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb5 */
241
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb6 */
242
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb7 */
243
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb8 */
244
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xb9 */
245
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xba */
246
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xbb */
247
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xbc */
248
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xbd */
249
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xbe */
250
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM,  /* 0xbf */
251
252
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc0 */
253
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc1 */
254
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc2 */
255
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc3 */
256
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc4 */
257
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc5 */
258
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0xc6 */
259
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0xc7 */
260
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc8 */
261
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xc9 */
262
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xca */
263
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xcb */
264
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xcc */
265
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL, /* 0xcd */
266
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS,  /* 0xce */
267
  LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE, /* 0xcf */
268
269
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd0 */
270
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd1 */
271
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd2 */
272
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd3 */
273
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd4 */
274
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd5 */
275
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd6 */
276
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd7 */
277
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd8 */
278
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xd9 */
279
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xda */
280
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xdb */
281
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xdc */
282
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xdd */
283
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xde */
284
  LIBFMOS_LZVN_OPPCODE_TYPE_INVALID,    /* 0xdf */
285
286
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_LARGE,  /* 0xe0 */
287
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe1 */
288
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe2 */
289
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe3 */
290
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe4 */
291
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe5 */
292
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe6 */
293
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe7 */
294
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe8 */
295
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xe9 */
296
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xea */
297
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xeb */
298
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xec */
299
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xed */
300
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xee */
301
  LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL,  /* 0xef */
302
303
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_LARGE,    /* 0xf0 */
304
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf1 */
305
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf2 */
306
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf3 */
307
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf4 */
308
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf5 */
309
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf6 */
310
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf7 */
311
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf8 */
312
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xf9 */
313
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xfa */
314
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xfb */
315
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xfc */
316
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xfd */
317
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xfe */
318
  LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL,    /* 0xff */
319
};
320
321
/* Decompresses LZVN compressed data
322
 * Returns 1 on success or -1 on error
323
 */
324
int libfmos_lzvn_decompress(
325
     const uint8_t *compressed_data,
326
     size_t compressed_data_size,
327
     uint8_t *uncompressed_data,
328
     size_t *uncompressed_data_size,
329
     libcerror_error_t **error )
330
0
{
331
0
  static char *function              = "libfmos_lzvn_decompress";
332
0
  size_t compressed_data_offset      = 0;
333
0
  size_t match_offset                = 0;
334
0
  size_t safe_uncompressed_data_size = 0;
335
0
  size_t uncompressed_data_offset    = 0;
336
0
  uint16_t distance                  = 0;
337
0
  uint16_t literal_size              = 0;
338
0
  uint16_t match_size                = 0;
339
0
  uint8_t oppcode                    = 0;
340
0
  uint8_t oppcode_type               = 0;
341
0
  uint8_t oppcode_value              = 0;
342
343
#if defined( HAVE_DEBUG_OUTPUT )
344
  size_t debug_match_offset          = 0;
345
  size_t oppcode_data_offset         = 0;
346
  size_t oppcode_data_size           = 0;
347
  uint16_t debug_match_size          = 0;
348
#endif
349
350
0
  if( compressed_data == NULL )
351
0
  {
352
0
    libcerror_error_set(
353
0
     error,
354
0
     LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
355
0
     LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE,
356
0
     "%s: invalid compressed data.",
357
0
     function );
358
359
0
    return( -1 );
360
0
  }
361
0
  if( compressed_data_size > (size_t) SSIZE_MAX )
362
0
  {
363
0
    libcerror_error_set(
364
0
     error,
365
0
     LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
366
0
     LIBCERROR_ARGUMENT_ERROR_VALUE_EXCEEDS_MAXIMUM,
367
0
     "%s: invalid compressed data size value exceeds maximum.",
368
0
     function );
369
370
0
    return( -1 );
371
0
  }
372
0
  if( uncompressed_data == NULL )
373
0
  {
374
0
    libcerror_error_set(
375
0
     error,
376
0
     LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
377
0
     LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE,
378
0
     "%s: invalid uncompressed data.",
379
0
     function );
380
381
0
    return( -1 );
382
0
  }
383
0
  if( uncompressed_data_size == NULL )
384
0
  {
385
0
    libcerror_error_set(
386
0
     error,
387
0
     LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
388
0
     LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE,
389
0
     "%s: invalid uncompressed data size.",
390
0
     function );
391
392
0
    return( -1 );
393
0
  }
394
0
  safe_uncompressed_data_size = *uncompressed_data_size;
395
396
0
  if( safe_uncompressed_data_size > (size_t) SSIZE_MAX )
397
0
  {
398
0
    libcerror_error_set(
399
0
     error,
400
0
     LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
401
0
     LIBCERROR_ARGUMENT_ERROR_VALUE_EXCEEDS_MAXIMUM,
402
0
     "%s: invalid uncompressed data size value exceeds maximum.",
403
0
     function );
404
405
0
    return( -1 );
406
0
  }
407
0
  while( compressed_data_offset < compressed_data_size )
408
0
  {
409
0
    if( uncompressed_data_offset >= safe_uncompressed_data_size )
410
0
    {
411
0
      break;
412
0
    }
413
0
    if( compressed_data_offset >= compressed_data_size )
414
0
    {
415
0
      libcerror_error_set(
416
0
       error,
417
0
       LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
418
0
       LIBCERROR_ARGUMENT_ERROR_VALUE_TOO_SMALL,
419
0
       "%s: compressed data size value too small.",
420
0
       function );
421
422
0
      return( -1 );
423
0
    }
424
#if defined( HAVE_DEBUG_OUTPUT )
425
    oppcode_data_offset = compressed_data_offset;
426
    oppcode_data_size   = 1;
427
#endif
428
0
    oppcode = compressed_data[ compressed_data_offset++ ];
429
430
0
    oppcode_type = libfmos_lzvn_oppcode_types[ oppcode ];
431
432
0
    literal_size = 0;
433
0
    match_size   = 0;
434
435
0
    switch( oppcode_type )
436
0
    {
437
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_LARGE:
438
#if defined( HAVE_DEBUG_OUTPUT )
439
        oppcode_data_size += 2;
440
#endif
441
0
        if( ( compressed_data_offset + 1 ) >= compressed_data_size )
442
0
        {
443
0
          libcerror_error_set(
444
0
           error,
445
0
           LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
446
0
           LIBCERROR_ARGUMENT_ERROR_VALUE_TOO_SMALL,
447
0
           "%s: compressed data size value too small.",
448
0
           function );
449
450
0
          return( -1 );
451
0
        }
452
0
        oppcode_value = compressed_data[ compressed_data_offset++ ];
453
454
0
        literal_size = ( oppcode & 0xc0 ) >> 6;
455
0
        match_size   = ( ( oppcode & 0x38 ) >> 3 ) + 3;
456
0
        distance     = ( (uint16_t) compressed_data[ compressed_data_offset++ ] << 8 ) | oppcode_value;
457
458
0
        break;
459
460
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_MEDIUM:
461
#if defined( HAVE_DEBUG_OUTPUT )
462
        oppcode_data_size += 2;
463
#endif
464
0
        if( ( compressed_data_offset + 1 ) >= compressed_data_size )
465
0
        {
466
0
          libcerror_error_set(
467
0
           error,
468
0
           LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
469
0
           LIBCERROR_ARGUMENT_ERROR_VALUE_TOO_SMALL,
470
0
           "%s: compressed data size value too small.",
471
0
           function );
472
473
0
          return( -1 );
474
0
        }
475
0
        oppcode_value = compressed_data[ compressed_data_offset++ ];
476
477
0
        literal_size = ( oppcode & 0x18 ) >> 3;
478
0
        match_size   = ( ( ( oppcode & 0x07 ) << 2 ) | ( oppcode_value & 0x03 ) ) + 3;
479
0
        distance     = ( (uint16_t) compressed_data[ compressed_data_offset++ ] << 6 ) | ( ( oppcode_value & 0xfc ) >> 2 );
480
481
0
        break;
482
483
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_PREVIOUS:
484
0
        literal_size = ( oppcode & 0xc0 ) >> 6;
485
0
        match_size   = ( ( oppcode & 0x38 ) >> 3 ) + 3;
486
487
0
        break;
488
489
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_DISTANCE_SMALL:
490
#if defined( HAVE_DEBUG_OUTPUT )
491
        oppcode_data_size += 1;
492
#endif
493
0
        if( compressed_data_offset >= compressed_data_size )
494
0
        {
495
0
          libcerror_error_set(
496
0
           error,
497
0
           LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
498
0
           LIBCERROR_ARGUMENT_ERROR_VALUE_TOO_SMALL,
499
0
           "%s: compressed data size value too small.",
500
0
           function );
501
502
0
          return( -1 );
503
0
        }
504
0
        literal_size = ( oppcode & 0xc0 ) >> 6;
505
0
        match_size   = ( ( oppcode & 0x38 ) >> 3 ) + 3;
506
0
        distance     = ( (uint16_t) ( oppcode & 0x07 ) << 8 ) | compressed_data[ compressed_data_offset++ ];
507
508
0
        break;
509
510
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_LARGE:
511
#if defined( HAVE_DEBUG_OUTPUT )
512
        oppcode_data_size += 1;
513
#endif
514
0
        if( compressed_data_offset >= compressed_data_size )
515
0
        {
516
0
          libcerror_error_set(
517
0
           error,
518
0
           LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
519
0
           LIBCERROR_ARGUMENT_ERROR_VALUE_TOO_SMALL,
520
0
           "%s: compressed data size value too small.",
521
0
           function );
522
523
0
          return( -1 );
524
0
        }
525
0
        literal_size = (uint16_t) compressed_data[ compressed_data_offset++ ] + 16;
526
527
0
        break;
528
529
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_LITERAL_SMALL:
530
0
        literal_size = oppcode & 0x0f;
531
532
0
        break;
533
534
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_LARGE:
535
#if defined( HAVE_DEBUG_OUTPUT )
536
        oppcode_data_size += 1;
537
#endif
538
0
        if( compressed_data_offset >= compressed_data_size )
539
0
        {
540
0
          libcerror_error_set(
541
0
           error,
542
0
           LIBCERROR_ERROR_DOMAIN_ARGUMENTS,
543
0
           LIBCERROR_ARGUMENT_ERROR_VALUE_TOO_SMALL,
544
0
           "%s: compressed data size value too small.",
545
0
           function );
546
547
0
          return( -1 );
548
0
        }
549
0
        match_size = (uint16_t) compressed_data[ compressed_data_offset++ ] + 16;
550
551
0
        break;
552
553
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_MATCH_SMALL:
554
0
        match_size = oppcode & 0x0f;
555
556
0
        break;
557
558
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_END_OF_STREAM:
559
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_NONE:
560
0
        break;
561
562
0
      case LIBFMOS_LZVN_OPPCODE_TYPE_INVALID:
563
0
      default:
564
0
        libcerror_error_set(
565
0
         error,
566
0
         LIBCERROR_ERROR_DOMAIN_RUNTIME,
567
0
         LIBCERROR_RUNTIME_ERROR_UNSUPPORTED_VALUE,
568
0
         "%s: invalid oppcode: 0x%02" PRIx8 ".",
569
0
         function,
570
0
         oppcode );
571
572
0
        return( -1 );
573
0
    }
574
#if defined( HAVE_DEBUG_OUTPUT )
575
    if( libcnotify_verbose != 0 )
576
    {
577
      libcnotify_printf(
578
       "%s: oppcode data:\n",
579
       function );
580
      libcnotify_print_data(
581
       &( compressed_data[ oppcode_data_offset ] ),
582
       oppcode_data_size,
583
       LIBCNOTIFY_PRINT_DATA_FLAG_GROUP_DATA );
584
585
      libcnotify_printf(
586
       "%s: oppcode\t\t\t\t\t: 0x%02" PRIx8 "\n",
587
       function,
588
       oppcode );
589
590
      libcnotify_printf(
591
       "%s: literal size\t\t\t\t\t: %" PRIu16 "\n",
592
       function,
593
       literal_size );
594
595
      libcnotify_printf(
596
       "%s: match size\t\t\t\t\t: %" PRIu16 "\n",
597
       function,
598
       match_size );
599
600
      libcnotify_printf(
601
       "%s: distance\t\t\t\t\t: %" PRIu16 "\n",
602
       function,
603
       distance );
604
605
      libcnotify_printf(
606
       "\n" );
607
    }
608
#endif /* defined( HAVE_DEBUG_OUTPUT ) */
609
610
0
    if( oppcode_type == LIBFMOS_LZVN_OPPCODE_TYPE_END_OF_STREAM )
611
0
    {
612
0
      break;
613
0
    }
614
0
    if( literal_size > 0 )
615
0
    {
616
0
      if( ( (size_t) literal_size > compressed_data_size )
617
0
       || ( compressed_data_offset > ( compressed_data_size - literal_size ) ) )
618
0
      {
619
0
        libcerror_error_set(
620
0
         error,
621
0
         LIBCERROR_ERROR_DOMAIN_RUNTIME,
622
0
         LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS,
623
0
         "%s: literal size value exceeds compressed data size.",
624
0
         function );
625
626
0
        return( -1 );
627
0
      }
628
0
      if( ( (size_t) literal_size > safe_uncompressed_data_size )
629
0
       || ( uncompressed_data_offset > ( safe_uncompressed_data_size - literal_size ) ) )
630
0
      {
631
0
        libcerror_error_set(
632
0
         error,
633
0
         LIBCERROR_ERROR_DOMAIN_RUNTIME,
634
0
         LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS,
635
0
         "%s: literal size value exceeds uncompressed data size.",
636
0
         function );
637
638
0
        return( -1 );
639
0
      }
640
#if defined( HAVE_DEBUG_OUTPUT )
641
      if( libcnotify_verbose != 0 )
642
      {
643
        libcnotify_printf(
644
         "%s: literal:\n",
645
         function );
646
        libcnotify_print_data(
647
         &( compressed_data[ compressed_data_offset ] ),
648
         literal_size,
649
         LIBCNOTIFY_PRINT_DATA_FLAG_GROUP_DATA );
650
      }
651
#endif
652
0
      if( memory_copy(
653
0
           &( uncompressed_data[ uncompressed_data_offset ] ),
654
0
           &( compressed_data[ compressed_data_offset ] ),
655
0
           (size_t) literal_size ) == NULL )
656
0
      {
657
0
        libcerror_error_set(
658
0
         error,
659
0
         LIBCERROR_ERROR_DOMAIN_MEMORY,
660
0
         LIBCERROR_MEMORY_ERROR_COPY_FAILED,
661
0
         "%s: unable to copy literal to uncompressed data.",
662
0
         function );
663
664
0
        return( -1 );
665
0
      }
666
0
      compressed_data_offset   += (size_t) literal_size;
667
0
      uncompressed_data_offset += (size_t) literal_size;
668
0
    }
669
0
    if( match_size > 0 )
670
0
    {
671
0
      if( (size_t) distance > uncompressed_data_offset )
672
0
      {
673
0
        libcerror_error_set(
674
0
         error,
675
0
         LIBCERROR_ERROR_DOMAIN_RUNTIME,
676
0
         LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS,
677
0
         "%s: distance value exceeds uncompressed data offset.",
678
0
         function );
679
680
0
        return( -1 );
681
0
      }
682
0
      match_offset = uncompressed_data_offset - distance;
683
684
0
      if( ( (size_t) match_size > safe_uncompressed_data_size )
685
0
       || ( uncompressed_data_offset > ( safe_uncompressed_data_size - match_size ) ) )
686
0
      {
687
0
        libcerror_error_set(
688
0
         error,
689
0
         LIBCERROR_ERROR_DOMAIN_RUNTIME,
690
0
         LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS,
691
0
         "%s: match size value exceeds uncompressed data size.",
692
0
         function );
693
694
0
        return( -1 );
695
0
      }
696
#if defined( HAVE_DEBUG_OUTPUT )
697
      if( libcnotify_verbose != 0 )
698
      {
699
        debug_match_offset = match_offset;
700
        debug_match_size   = match_size;
701
702
        libcnotify_printf(
703
         "%s: match offset\t\t\t\t\t: 0x%" PRIzx "\n",
704
         function,
705
         debug_match_offset );
706
      }
707
#endif
708
0
      while( match_size > 0 )
709
0
      {
710
0
        uncompressed_data[ uncompressed_data_offset++ ] = uncompressed_data[ match_offset++ ];
711
712
0
        match_size--;
713
0
      }
714
#if defined( HAVE_DEBUG_OUTPUT )
715
      if( libcnotify_verbose != 0 )
716
      {
717
        libcnotify_printf(
718
         "%s: match:\n",
719
         function );
720
        libcnotify_print_data(
721
         &( uncompressed_data[ debug_match_offset ] ),
722
         debug_match_size,
723
         LIBCNOTIFY_PRINT_DATA_FLAG_GROUP_DATA );
724
      }
725
#endif
726
0
    }
727
0
  }
728
0
  *uncompressed_data_size = uncompressed_data_offset;
729
730
0
  return( 1 );
731
0
}
732