pub struct CStringLiteralCodec;Expand description
Encodes and decodes byte-oriented C string literal fragments.
This codec is intended for textual formats that embed byte sequences with C
escapes, such as PK\003\004 or \xd0\xcf. It decodes into raw bytes and
does not require surrounding quotes.
Hexadecimal \x and \X escapes consume one or two digits. Octal escapes
consume one to three digits and retain only the low eight bits. Universal
\u and \U escapes require exactly four or eight hex digits,
respectively, and their values must fit in one byte. They produce that byte
directly rather than converting a Unicode code point to UTF-8. The decoder
does not remove surrounding quotes. Raw source text is limited to printable
ASCII, tab, line feed, vertical tab, and form feed; other bytes, including
non-ASCII text and raw carriage returns, must be escaped. An escaped space
(\ ) is also accepted.
The owned decode helper treats its input as complete text.
For streaming input, use Codec::decode_eof after confirming EOF to
resolve format-specific short escapes. Open-stream decoding requests more
input only when the visible escape prefix can still form a valid byte value.
For malformed input, a streaming skip/replace hook may consume the invalid
span visible in the current input chunk; recovery can therefore depend on
chunk boundaries. Valid input and strict decoding are unaffected.
See the English README
and Chinese README
for a safe streaming adapter example and the linked EOF short-escape test.
Its low-level Codec<Value = u8, Unit = u8> implementation handles one
raw byte or one C escape fragment. Whole-fragment iteration remains part of
the owned encode and decode helpers.
§Examples
use qubit_codec_misc::CStringLiteralCodec;
let codec = CStringLiteralCodec::new();
assert_eq!(codec.encode(b"Hi"), "Hi");
assert_eq!(codec.decode(r"\x48\x69").unwrap(), b"Hi");Implementations§
Source§impl CStringLiteralCodec
impl CStringLiteralCodec
Sourcepub fn decode(&self, text: &str) -> MiscCodecResult<Vec<u8>>
pub fn decode(&self, text: &str) -> MiscCodecResult<Vec<u8>>
Decodes a C string literal fragment into bytes.
§Parameters
text: C string literal fragment without surrounding quotes.
§Returns
Decoded raw bytes.
§Errors
Returns MiscCodecError::InvalidEscape for malformed escape
sequences, MiscCodecError::InvalidDigit for malformed
fixed-width numeric escapes,
and MiscCodecError::InvalidCharacter for unsupported raw source
characters.
Trait Implementations§
Source§impl Clone for CStringLiteralCodec
impl Clone for CStringLiteralCodec
Source§impl Codec for CStringLiteralCodec
impl Codec for CStringLiteralCodec
Source§fn encode_len(&self, value: &u8) -> usize
fn encode_len(&self, value: &u8) -> usize
Returns the exact C string literal width for one byte.
Source§unsafe fn decode(
&mut self,
input: &[u8],
input_index: usize,
) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
unsafe fn decode( &mut self, input: &[u8], input_index: usize, ) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
Decodes one raw byte or one C escape fragment.
§Safety
The caller must provide an input index with at least one readable unit and a slice satisfying the codec trait’s decode preconditions.
Source§unsafe fn decode_eof(
&mut self,
input: &[u8],
input_index: usize,
) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
unsafe fn decode_eof( &mut self, input: &[u8], input_index: usize, ) -> Result<(u8, NonZeroUsize), DecodeFailure<Self::DecodeError>>
Decodes one value after end of input has been confirmed.
§Safety
The caller must provide an input index with at least one readable unit and a slice satisfying the codec trait’s EOF decode preconditions.
Source§unsafe fn encode(
&mut self,
value: &u8,
output: &mut [u8],
output_index: usize,
) -> Result<usize, Self::EncodeError>
unsafe fn encode( &mut self, value: &u8, output: &mut [u8], output_index: usize, ) -> Result<usize, Self::EncodeError>
Encodes one byte as a raw byte or C escape fragment.
§Safety
The caller must provide enough writable output units for
Self::encode_len.
Source§const MIN_UNITS_PER_VALUE: usize = 1
const MIN_UNITS_PER_VALUE: usize = 1
Source§const MAX_ENCODE_UNITS_PER_VALUE: usize = 4
const MAX_ENCODE_UNITS_PER_VALUE: usize = 4
Source§const MAX_DECODE_UNITS_PER_VALUE: usize = 10
const MAX_DECODE_UNITS_PER_VALUE: usize = 10
Source§type DecodeError = MiscCodecError
type DecodeError = MiscCodecError
Source§type EncodeError = MiscCodecError
type EncodeError = MiscCodecError
Source§const MAX_ENCODE_RESET_UNITS: usize = 0
const MAX_ENCODE_RESET_UNITS: usize = 0
Source§const MAX_ENCODE_FINISH_UNITS: usize = 0
const MAX_ENCODE_FINISH_UNITS: usize = 0
Source§const MAX_DECODE_RESET_VALUES: usize = 0
const MAX_DECODE_RESET_VALUES: usize = 0
Source§const MAX_DECODE_FINISH_VALUES: usize = 0
const MAX_DECODE_FINISH_VALUES: usize = 0
Source§fn can_encode_value(&self, _value: &Self::Value) -> bool
fn can_encode_value(&self, _value: &Self::Value) -> bool
value is in this codec’s encodable value domain. Read moreSource§unsafe fn encode_reset(
&mut self,
_output: &mut [Self::Unit],
_output_index: usize,
) -> Result<usize, Self::EncodeError>
unsafe fn encode_reset( &mut self, _output: &mut [Self::Unit], _output_index: usize, ) -> Result<usize, Self::EncodeError>
Source§unsafe fn encode_finish(
&mut self,
_output: &mut [Self::Unit],
_output_index: usize,
) -> Result<usize, Self::EncodeError>
unsafe fn encode_finish( &mut self, _output: &mut [Self::Unit], _output_index: usize, ) -> Result<usize, Self::EncodeError>
Source§unsafe fn decode_reset(
&mut self,
_output: &mut [Self::Value],
_output_index: usize,
) -> Result<usize, Self::DecodeError>
unsafe fn decode_reset( &mut self, _output: &mut [Self::Value], _output_index: usize, ) -> Result<usize, Self::DecodeError>
Source§unsafe fn decode_finish(
&mut self,
_output: &mut [Self::Value],
_output_index: usize,
) -> Result<usize, Self::DecodeError>
unsafe fn decode_finish( &mut self, _output: &mut [Self::Value], _output_index: usize, ) -> Result<usize, Self::DecodeError>
output. Read more