From 68efea08fa1cf800b3b76683992ec77a89323d53 Mon Sep 17 00:00:00 2001 From: Tobias Bucher Date: Tue, 26 Jul 2016 01:39:54 +0200 Subject: Restore `char::escape_default` and add `char::escape` instead --- src/libcore/char.rs | 38 +++++++++++++++++++++++++++++++++++++- src/libcore/fmt/mod.rs | 4 ++-- 2 files changed, 39 insertions(+), 3 deletions(-) (limited to 'src/libcore') diff --git a/src/libcore/char.rs b/src/libcore/char.rs index 0d39217bd72..3e435b47110 100644 --- a/src/libcore/char.rs +++ b/src/libcore/char.rs @@ -264,6 +264,8 @@ pub trait CharExt { fn escape_unicode(self) -> EscapeUnicode; #[stable(feature = "core", since = "1.6.0")] fn escape_default(self) -> EscapeDefault; + #[unstable(feature = "char_escape", issue = "0")] + fn escape(self) -> Escape; #[stable(feature = "core", since = "1.6.0")] fn len_utf8(self) -> usize; #[stable(feature = "core", since = "1.6.0")] @@ -316,6 +318,19 @@ impl CharExt for char { #[inline] fn escape_default(self) -> EscapeDefault { + let init_state = match self { + '\t' => EscapeDefaultState::Backslash('t'), + '\r' => EscapeDefaultState::Backslash('r'), + '\n' => EscapeDefaultState::Backslash('n'), + '\\' | '\'' | '"' => EscapeDefaultState::Backslash(self), + '\x20' ... '\x7e' => EscapeDefaultState::Char(self), + _ => EscapeDefaultState::Unicode(self.escape_unicode()) + }; + EscapeDefault { state: init_state } + } + + #[inline] + fn escape(self) -> Escape { let init_state = match self { '\t' => EscapeDefaultState::Backslash('t'), '\r' => EscapeDefaultState::Backslash('r'), @@ -324,7 +339,7 @@ impl CharExt for char { c if is_printable(c) => EscapeDefaultState::Char(c), c => EscapeDefaultState::Unicode(c.escape_unicode()), }; - EscapeDefault { state: init_state } + Escape(EscapeDefault { state: init_state }) } #[inline] @@ -601,6 +616,27 @@ impl ExactSizeIterator for EscapeDefault { } } +/// An iterator that yields the literal escape code of a `char`. +/// +/// This `struct` is created by the [`escape()`] method on [`char`]. See its +/// documentation for more. +/// +/// [`escape()`]: ../../std/primitive.char.html#method.escape +/// [`char`]: ../../std/primitive.char.html +#[unstable(feature = "char_escape", issue = "0")] +#[derive(Clone, Debug)] +pub struct Escape(EscapeDefault); + +#[unstable(feature = "char_escape", issue = "0")] +impl Iterator for Escape { + type Item = char; + fn next(&mut self) -> Option { self.0.next() } + fn size_hint(&self) -> (usize, Option) { self.0.size_hint() } +} + +#[unstable(feature = "char_escape", issue = "0")] +impl ExactSizeIterator for Escape { } + /// An iterator over `u8` entries represending the UTF-8 encoding of a `char` /// value. /// diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index e5eb8f21382..3bcdce57af0 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -1383,7 +1383,7 @@ impl Debug for str { f.write_char('"')?; let mut from = 0; for (i, c) in self.char_indices() { - let esc = c.escape_default(); + let esc = c.escape(); // If char needs escaping, flush backlog so far and write, else skip if esc.len() != 1 { f.write_str(&self[from..i])?; @@ -1409,7 +1409,7 @@ impl Display for str { impl Debug for char { fn fmt(&self, f: &mut Formatter) -> Result { f.write_char('\'')?; - for c in self.escape_default() { + for c in self.escape() { f.write_char(c)? } f.write_char('\'') -- cgit 1.4.1-3-g733a5