aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2019-03-29 18:53:46 -0700
committeriximeow <me@iximeow.net>2020-01-12 16:26:39 -0800
commit0b7536284cbae6e085eeeda602512449a42ca22a (patch)
treed43ca192e64a13398253a7c5941019fe53947e88
parentc960b06863024087437644524894f247e8a4b448 (diff)
add some display logic into arch
-rw-r--r--src/display.rs115
-rw-r--r--src/lib.rs1
2 files changed, 116 insertions, 0 deletions
diff --git a/src/display.rs b/src/display.rs
new file mode 100644
index 0000000..7dcdfb5
--- /dev/null
+++ b/src/display.rs
@@ -0,0 +1,115 @@
+pub enum NumberStyleHint {
+ Signed,
+ HexSigned,
+ SignedWithSign,
+ HexSignedWithSign,
+ SignedWithSignSplit,
+ HexSignedWithSignSplit,
+ Unsigned,
+ HexUnsigned,
+ UnsignedWithSign,
+ HexUnsignedWithSign
+}
+
+pub fn format_number_i32(i: i32, hint: NumberStyleHint) -> String {
+ match hint {
+ NumberStyleHint::Signed => {
+ format!("{}", i)
+ },
+ NumberStyleHint::HexSigned => {
+ if i == std::i32::MIN {
+ format!("-0x7fffffff")
+ } else if i < 0 {
+ format!("-{:#x}", -i)
+ } else {
+ format!("{:#x}", i)
+ }
+ },
+ NumberStyleHint::Unsigned => {
+ format!("{}", i as u32)
+ },
+ NumberStyleHint::HexUnsigned => {
+ format!("{:#x}", i as u32)
+ },
+ NumberStyleHint::SignedWithSignSplit => {
+ if i == std::i32::MIN {
+ format!("- 2147483647")
+ } else if i < 0 {
+ format!("- {}", -i)
+ } else {
+ format!("+ {}", i)
+ }
+ }
+ NumberStyleHint::HexSignedWithSignSplit => {
+ if i == std::i32::MIN {
+ format!("- 0x7fffffff")
+ } else if i < 0 {
+ format!("- {:#x}", -i)
+ } else {
+ format!("+ {:#x}", i)
+ }
+ },
+ NumberStyleHint::HexSignedWithSign => {
+ if i == std::i32::MIN {
+ format!("-0x7fffffff")
+ } else if i < 0 {
+ format!("-{:#x}", -i)
+ } else {
+ format!("+{:#x}", i)
+ }
+ },
+ NumberStyleHint::SignedWithSign => {
+ format!("{:+}", i)
+ }
+ NumberStyleHint::HexUnsignedWithSign => {
+ format!("{:+#x}", i as u32)
+ },
+ NumberStyleHint::UnsignedWithSign => {
+ format!("{:+}", i as u32)
+ }
+ }
+}
+
+pub fn signed_i8_hex(imm: i8) -> String {
+ let (sign, imm) = if imm == std::i8::MIN {
+ (false, imm)
+ } else if imm < 0 {
+ (true, -imm)
+ } else {
+ (false, imm)
+ };
+ format!("{}{:#x}", sign, imm)
+}
+
+pub fn signed_i16_hex(imm: i16) -> String {
+ let (sign, imm) = if imm == std::i16::MIN {
+ (false, imm)
+ } else if imm < 0 {
+ (true, -imm)
+ } else {
+ (false, imm)
+ };
+ format!("{}{:#x}", sign, imm)
+}
+
+pub fn signed_i32_hex(imm: i32) -> String {
+ let (sign, imm) = if imm == std::i32::MIN {
+ (false, imm)
+ } else if imm < 0 {
+ (true, -imm)
+ } else {
+ (false, imm)
+ };
+ format!("{}{:#x}", sign, imm)
+}
+
+pub fn signed_i64_hex(imm: i64) -> String {
+ let (sign, imm) = if imm == std::i64::MIN {
+ (false, imm)
+ } else if imm < 0 {
+ (true, -imm)
+ } else {
+ (false, imm)
+ };
+ format!("{}{:#x}", sign, imm)
+}
diff --git a/src/lib.rs b/src/lib.rs
index f11c9d5..35944a6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -14,6 +14,7 @@ use num_traits::{Bounded, WrappingAdd, WrappingSub, CheckedAdd, CheckedSub};
use termion::color;
+pub mod display;
// This is pretty wonk..
pub trait AddressDisplay {
fn stringy(&self) -> String;