bool combine_ucs2_byte (RECODE_SUBTASK subtask) { struct state *state = NULL; unsigned value; if (get_ucs2 (&value, subtask)) { while (true) { struct state *shift = find_shifted_state (state, value, subtask->step); if (shift) { state = shift; if (!get_ucs2 (&value, subtask)) break; } else if (state) { if (state->result == NOT_A_CHARACTER) backtrack_byte (state, subtask); else put_byte (state->result, subtask); state = NULL; } else { put_byte (value, subtask); if (!get_ucs2 (&value, subtask)) break; } } if (state) { if (state->result == NOT_A_CHARACTER) backtrack_byte (state, subtask); else put_byte (state->result, subtask); } } SUBTASK_RETURN (subtask); }
bool combine_byte_byte (RECODE_CONST_STEP step, RECODE_TASK task) { struct state *state = NULL; unsigned value; if (value = get_byte (task), value != EOF) { while (true) { struct state *shift = find_shifted_state (state, value, step); if (shift) { state = shift; if (value = get_byte (task), value == EOF) break; } else if (state) { if (state->result == NOT_A_CHARACTER) backtrack_byte (state, task); else put_byte (state->result, task); state = NULL; } else { put_byte (value, task); if (value = get_byte (task), value == EOF) break; } } if (state) if (state->result == NOT_A_CHARACTER) backtrack_byte (state, task); else put_byte (state->result, task); } TASK_RETURN (task); }
static void backtrack_byte (struct state *state, RECODE_SUBTASK subtask) { if (state->result == NOT_A_CHARACTER) { backtrack_byte (state->unshift, subtask); put_byte (state->character, subtask); } else put_byte (state->result, subtask); }