Exemple #1
0
static dsk_boolean
dsk_utf8_fixer_finish  (DskOctetFilter *filter,
                        DskBuffer      *out,
                        DskError      **error)
{
  DskUtf8Fixer *fixer = (DskUtf8Fixer *) filter;
  unsigned i;
  DSK_UNUSED (error);
  for (i = 0; i < fixer->spare_len; i++)
    handle_bad_char (fixer, out, fixer->spare[i]);
  return DSK_TRUE;
}
Exemple #2
0
/*************************************************
* Convert some data from hex format              *
*************************************************/
void Hex_Decoder::write(const byte input[], u32bit length)
   {
   for(u32bit j = 0; j != length; ++j)
      {
      if(is_valid(input[j]))
         in[position++] = input[j];
      else
         handle_bad_char(input[j]);
      if(position == in.size())
         {
         decode_and_send(in, in.size());
         position = 0;
         }
      }
   }
Exemple #3
0
static dsk_boolean
dsk_utf8_fixer_process  (DskOctetFilter *filter,
                         DskBuffer      *out,
                         unsigned        in_length,
                         const uint8_t  *in_data,
                         DskError      **error)
{
  DskUtf8Fixer *fixer = (DskUtf8Fixer *) filter;
  DSK_UNUSED (error);
retry_spare:
  if (fixer->spare_len)
    {
      unsigned used = 6 - fixer->spare_len;
      unsigned u;
      if (used < in_length)
        used = in_length;
      memcpy (fixer->spare + fixer->spare_len, in_data, used);
      switch (dsk_utf8_validate (fixer->spare_len + used, (char*) fixer->spare, &u))
        {
        case DSK_UTF8_VALIDATION_SUCCESS:
          dsk_buffer_append (out, fixer->spare_len, fixer->spare);
          in_length -= used;
          in_data += used;
          fixer->spare_len = 0;
          break;
        case DSK_UTF8_VALIDATION_PARTIAL:
          dsk_assert (u > fixer->spare_len);
          dsk_buffer_append (out, u, fixer->spare);
          in_length -= u - fixer->spare_len;
          in_data += u - fixer->spare_len;
          fixer->spare_len = 0;
          break;
        case DSK_UTF8_VALIDATION_INVALID:
          dsk_buffer_append (out, u, fixer->spare);
          if (u < fixer->spare_len)
            {
              handle_bad_char (fixer, out, fixer->spare[u]);
              u++;
              memmove (fixer->spare, fixer->spare + u, fixer->spare_len - u);
              fixer->spare_len -= u;
              goto retry_spare;
            }
          else
            {
              in_length -= u - fixer->spare_len;
              in_data += u - fixer->spare_len;
              fixer->spare_len = 0;
            }
          break;
        }
    }
  while (in_length)
    {
      unsigned used;
      switch (dsk_utf8_validate (in_length, (char*) in_data, &used))
        {
        case DSK_UTF8_VALIDATION_SUCCESS:
          dsk_buffer_append (out, used, in_data);
          return DSK_TRUE;
        case DSK_UTF8_VALIDATION_PARTIAL:
          dsk_assert (in_length - used <= 6);
          dsk_buffer_append (out, used, in_data);
          fixer->spare_len = in_length - used;
          memcpy (fixer->spare, in_data, fixer->spare_len);
          return DSK_TRUE;
        case DSK_UTF8_VALIDATION_INVALID:
          if (used > 0)
            {
              dsk_buffer_append (out, used, in_data);
              in_data += used;
              in_length -= used;
            }
          dsk_assert (in_length > 0);
          dsk_assert (*in_data >= 128);
          handle_bad_char (fixer, out, *in_data);
          in_length--;
          in_data++;
          break;
        }
    }
  return DSK_TRUE;
}