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; }
/************************************************* * 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; } } }
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; }