| // Copyright 2026 Google LLC | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| //! A tiny escaping library used by the Rust FuzzTest codelab. | |
| //! | |
| //! It converts special characters in a byte string into C-style escape | |
| //! sequences and back. | |
| //! | |
| //! The library intentionally contains two bugs that the codelab's fuzz tests | |
| //! are meant to discover, so please don't "fix" them. | |
| /// Returns `input` with special characters replaced by C-style escape | |
| /// sequences. | |
| pub fn escape(input: &[u8]) -> Vec<u8> { | |
| let mut result = Vec::with_capacity(input.len()); | |
| for &byte in input { | |
| match byte { | |
| b'\n' => result.extend_from_slice(br"\n"), | |
| b'\r' => result.extend_from_slice(br"\r"), | |
| b'\t' => result.extend_from_slice(br"\t"), | |
| b'\\' => result.extend_from_slice(br"\\"), | |
| _ => result.push(byte), | |
| } | |
| } | |
| result | |
| } | |
| /// Returns `input` with C-style escape sequences replaced by the characters | |
| /// they represent. | |
| /// | |
| /// Unrecognized escape sequences are dropped. | |
| pub fn unescape(input: &[u8]) -> Vec<u8> { | |
| let mut result = Vec::with_capacity(input.len()); | |
| let mut i = 0; | |
| while i < input.len() { | |
| if input[i] == b'\\' { | |
| i += 1; | |
| match input[i] { | |
| b'n' => result.push(b'\n'), | |
| b't' => result.push(b'\t'), | |
| b'\\' => result.push(b'\\'), | |
| _ => {} | |
| } | |
| } else { | |
| result.push(input[i]); | |
| } | |
| i += 1; | |
| } | |
| result | |
| } |