mirror of
https://git.sr.ht/~spicywolf/k2spice
synced 2025-01-18 17:59:39 +00:00
out of bounds error during \0nnn checks
This commit is contained in:
parent
6a8f7dce84
commit
c7de1c312c
|
@ -27,64 +27,60 @@
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
|
fn escape(escstr: String) -> String {
|
||||||
|
let escmap = vec![
|
||||||
|
("\\\\", "\\"),
|
||||||
|
//("\\a", "\a"),
|
||||||
|
//("\\b", "\b"),
|
||||||
|
//("\\f", "\f"),
|
||||||
|
("\\n", "\n"),
|
||||||
|
("\\r", "\r"),
|
||||||
|
("\\t", "\t"),
|
||||||
|
//("\\v", "\v"),
|
||||||
|
];
|
||||||
|
let mut im = escstr.to_owned();
|
||||||
|
for esc in escmap {
|
||||||
|
im = str::replace(im.as_str(), esc.0, esc.1);
|
||||||
|
}
|
||||||
|
// TODO: Handle octal esc \0n where n is 1-, 2-, or 3-digit octal number
|
||||||
|
let mut octstr: String = String::new();
|
||||||
|
let escb = im.as_bytes();
|
||||||
|
let mut i = 0;
|
||||||
|
while i < escb.len() {
|
||||||
|
if !(i + 1 >= escb.len()) {
|
||||||
|
let mut xe = i + 1;
|
||||||
|
if !(escb[i] == b'\\' && escb[xe] == b'0') {
|
||||||
|
octstr += &im[i..i + 1];
|
||||||
|
i += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
i = xe + 1;
|
||||||
|
while char::from(escb[xe + 1]).is_digit(8) && i - xe < 3 {
|
||||||
|
xe += 1;
|
||||||
|
}
|
||||||
|
let c: u8 = if let Ok(x) = u8::from_str_radix(&im[i..xe], 8) {
|
||||||
|
x
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
octstr += char::from(c).to_string().as_str();
|
||||||
|
i = xe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: find and handle \c
|
||||||
|
let mut retitr = octstr.split("\\c").peekable();
|
||||||
|
if let Some(retstr) = retitr.next() {
|
||||||
|
if retitr.peek().is_none() {
|
||||||
|
(retstr.to_owned() + "\n").clone()
|
||||||
|
} else {
|
||||||
|
retstr.to_string().clone()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String::from("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let print: String = env::args().skip(1).collect::<Vec<String>>().join(" ");
|
let print: String = env::args().skip(1).collect::<Vec<String>>().join(" ");
|
||||||
// This does not currently mimic functionality of illumos echo
|
print!("{}", escape(print));
|
||||||
if print.is_empty() {
|
|
||||||
println!("");
|
|
||||||
} else {
|
|
||||||
println!("{print}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// This mimics illumos echo functionality, or it should
|
|
||||||
/*
|
|
||||||
let mut esc: bool = false;
|
|
||||||
let mut is_num: bool = false;
|
|
||||||
let mut oct: String = "".to_string();
|
|
||||||
let mut oc: u8 = 0;
|
|
||||||
|
|
||||||
for c in print.chars() {
|
|
||||||
if !esc {
|
|
||||||
if c == '\\' {
|
|
||||||
esc = true;
|
|
||||||
} else {
|
|
||||||
print!("{c}");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
match c {
|
|
||||||
// "unknown character escape" wtf rust these are valid.
|
|
||||||
//'a' => print!("\a"),
|
|
||||||
//'b' => print!("\b"),
|
|
||||||
//'c' => print!("\c"),
|
|
||||||
//'f' => print!("\f"),
|
|
||||||
'n' => print!("\n"),
|
|
||||||
'r' => print!("\r"),
|
|
||||||
't' => print!("\t"),
|
|
||||||
//'v' => print!("\v"),
|
|
||||||
'\\' => print!("\\"),
|
|
||||||
'0' => is_num = true,
|
|
||||||
_ => print!("\\{c}"),
|
|
||||||
}
|
|
||||||
if is_num {
|
|
||||||
if oc < 3 {
|
|
||||||
oct.push(c);
|
|
||||||
oc = oc + 1;
|
|
||||||
}
|
|
||||||
if oc == 2 {
|
|
||||||
match u32::from_str_radix(oct.as_str(), 8) {
|
|
||||||
Ok(chr) => print!("{}", chr),
|
|
||||||
Err(_) => print!("\\0{}", oct),
|
|
||||||
}
|
|
||||||
is_num = false;
|
|
||||||
oct = "".to_string();
|
|
||||||
oc = 0;
|
|
||||||
esc = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
esc = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print!("\n");
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue