static HSE_state st_yield_literal(heatshrink_encoder *hse, output_info *oi) { if (can_take_byte(oi)) { push_literal_byte(hse, oi); return HSES_SEARCH; } else { return HSES_YIELD_LITERAL; } }
static HSE_state ICACHE_FLASH_ATTR st_yield_literal(heatshrink_encoder *hse, output_info *oi) { if (can_take_byte(oi)) { push_literal_byte(hse, oi); hse->flags &= ~FLAG_HAS_LITERAL; if (on_final_literal(hse)) { return HSES_FLUSH_BITS; } return hse->match_length > 0 ? HSES_YIELD_TAG_BIT : HSES_SEARCH; } else { return HSES_YIELD_LITERAL; } }
static HSE_state st_flush_bit_buffer(heatshrink_encoder *hse, output_info *oi) { if (hse->bit_index == 0x80) { LOG("-- done!\n"); return HSES_DONE; } else if (can_take_byte(oi)) { LOG("-- flushing remaining byte (bit_index == 0x%02x)\n", hse->bit_index); oi->buf[(*oi->output_size)++] = hse->current_byte; LOG("-- done!\n"); return HSES_DONE; } else { return HSES_FLUSH_BITS; } }
static HSE_state st_yield_br_length(heatshrink_encoder *hse, output_info *oi) { if (can_take_byte(oi)) { LOG("-- yielding backref length %u\n", hse->match_length); if (push_outgoing_bits(hse, oi) > 0) { return HSES_YIELD_BR_LENGTH; } else { hse->match_scan_index += hse->match_length; hse->match_length = 0; return HSES_SEARCH; } } else { return HSES_YIELD_BR_LENGTH; } }
static HSE_state st_yield_br_index(heatshrink_encoder *hse, output_info *oi) { if (can_take_byte(oi)) { LOG("-- yielding backref index %u\n", hse->match_pos); if (push_outgoing_bits(hse, oi) > 0) { return HSES_YIELD_BR_INDEX; /* continue */ } else { hse->outgoing_bits = hse->match_length - 1; hse->outgoing_bits_count = HEATSHRINK_ENCODER_LOOKAHEAD_BITS(hse); return HSES_YIELD_BR_LENGTH; /* done */ } } else { return HSES_YIELD_BR_INDEX; /* continue */ } }
static HSE_state st_yield_tag_bit(heatshrink_encoder *hse, output_info *oi) { if (can_take_byte(oi)) { if (hse->match_length == 0) { add_tag_bit(hse, oi, HEATSHRINK_LITERAL_MARKER); return HSES_YIELD_LITERAL; } else { add_tag_bit(hse, oi, HEATSHRINK_BACKREF_MARKER); hse->outgoing_bits = hse->match_pos - 1; hse->outgoing_bits_count = HEATSHRINK_ENCODER_WINDOW_BITS(hse); return HSES_YIELD_BR_INDEX; } } else { return HSES_YIELD_TAG_BIT; /* output is full, continue */ } }