about summary refs log tree commit diff stats
path: root/usr/src/mei/echo
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/mei/echo')
-rw-r--r--usr/src/mei/echo/Cargo.toml12
-rw-r--r--usr/src/mei/echo/src/main.rs90
2 files changed, 102 insertions, 0 deletions
diff --git a/usr/src/mei/echo/Cargo.toml b/usr/src/mei/echo/Cargo.toml
new file mode 100644
index 0000000..0b34ec5
--- /dev/null
+++ b/usr/src/mei/echo/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "echo"
+version = "0.1.0"
+edition = "2021"
+
+[[bin]]
+name = "echo"
+path = "src/main.rs"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/usr/src/mei/echo/src/main.rs b/usr/src/mei/echo/src/main.rs
new file mode 100644
index 0000000..ad5eee9
--- /dev/null
+++ b/usr/src/mei/echo/src/main.rs
@@ -0,0 +1,90 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2023 Ren Kararou  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+use std::env;
+
+fn main() {
+    let print: String = env::args().skip(1).collect::<Vec<String>>().join(" ");
+    // This does not currently mimic functionality of illumos echo
+    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");
+    */
+}