Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}