Home | History | Annotate | Download | only in xz

Lines Matching refs:dict

264 	struct dictionary dict;
286 static void dict_reset(struct dictionary *dict, struct xz_buf *b)
288 if (DEC_IS_SINGLE(dict->mode)) {
289 dict->buf = b->out + b->out_pos;
290 dict->end = b->out_size - b->out_pos;
293 dict->start = 0;
294 dict->pos = 0;
295 dict->limit = 0;
296 dict->full = 0;
300 static void dict_limit(struct dictionary *dict, size_t out_max)
302 if (dict->end - dict->pos <= out_max)
303 dict->limit = dict->end;
305 dict->limit = dict->pos + out_max;
309 static inline bool dict_has_space(const struct dictionary *dict)
311 return dict->pos < dict->limit;
320 static inline uint32_t dict_get(const struct dictionary *dict, uint32_t dist)
322 size_t offset = dict->pos - dist - 1;
324 if (dist >= dict->pos)
325 offset += dict->end;
327 return dict->full > 0 ? dict->buf[offset] : 0;
333 static inline void dict_put(struct dictionary *dict, uint8_t byte)
335 dict->buf[dict->pos++] = byte;
337 if (dict->full < dict->pos)
338 dict->full = dict->pos;
346 static bool dict_repeat(struct dictionary *dict, uint32_t *len, uint32_t dist)
351 if (dist >= dict->full || dist >= dict->size)
354 left = min_t(size_t, dict->limit - dict->pos, *len);
357 back = dict->pos - dist - 1;
358 if (dist >= dict->pos)
359 back += dict->end;
362 dict->buf[dict->pos++] = dict->buf[back++];
363 if (back == dict->end)
367 if (dict->full < dict->pos)
368 dict->full = dict->pos;
374 static void dict_uncompressed(struct dictionary *dict, struct xz_buf *b,
383 if (copy_size > dict->end - dict->pos)
384 copy_size = dict->end - dict->pos;
390 memcpy(dict->buf + dict->pos, b->in + b->in_pos, copy_size);
391 dict->pos += copy_size;
393 if (dict->full < dict->pos)
394 dict->full = dict->pos;
396 if (DEC_IS_MULTI(dict->mode)) {
397 if (dict->pos == dict->end)
398 dict->pos = 0;
404 dict->start = dict->pos;
416 static uint32_t dict_flush(struct dictionary *dict, struct xz_buf *b)
418 size_t copy_size = dict->pos - dict->start;
420 if (DEC_IS_MULTI(dict->mode)) {
421 if (dict->pos == dict->end)
422 dict->pos = 0;
424 memcpy(b->out + b->out_pos, dict->buf + dict->start,
428 dict->start = dict->pos;
574 uint32_t prev_byte = dict_get(&s->dict, 0);
576 uint32_t high = (s->dict.pos & s->lzma.literal_pos_mask) << s->lzma.lc;
596 match_byte = dict_get(&s->dict, s->lzma.rep0) << 1;
614 dict_put(&s->dict, (uint8_t)symbol);
730 if (dict_has_space(&s->dict) && s->lzma.len > 0)
731 dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0);
737 while (dict_has_space(&s->dict) && !rc_limit_exceeded(&s->rc)) {
738 pos_state = s->dict.pos & s->lzma.pos_mask;
749 if (!dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0))
978 dict_reset(&s->dict, b);
1070 dict_limit(&s->dict, min_t(size_t,
1076 s->lzma2.uncompressed -= dict_flush(&s->dict, b);
1096 dict_uncompressed(&s->dict, b, &s->lzma2.compressed);
1115 s->dict.mode = mode;
1116 s->dict.size_max = dict_max;
1119 s->dict.buf = vmalloc(dict_max);
1120 if (s->dict.buf == NULL) {
1125 s->dict.buf = NULL;
1126 s->dict.allocated = 0;
1138 s->dict.size = 2 + (props & 1);
1139 s->dict.size <<= (props >> 1) + 11;
1141 if (DEC_IS_MULTI(s->dict.mode)) {
1142 if (s->dict.size > s->dict.size_max)
1145 s->dict.end = s->dict.size;
1147 if (DEC_IS_DYNALLOC(s->dict.mode)) {
1148 if (s->dict.allocated < s->dict.size) {
1149 vfree(s->dict.buf);
1150 s->dict.buf = vmalloc(s->dict.size);
1151 if (s->dict.buf == NULL) {
1152 s->dict.allocated = 0;
1171 if (DEC_IS_MULTI(s->dict.mode))
1172 vfree(s->dict.buf);