aboutsummaryrefslogtreecommitdiff
path: root/src/display.rs
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2024-06-22 11:03:43 -0700
committeriximeow <me@iximeow.net>2024-06-22 11:03:59 -0700
commita66be66c22bc31526ac35c1cffdb28992a392ccf (patch)
tree6f49a2e49114256121d3239c2d7223cf635d3c9e /src/display.rs
parentc21a5f2956d8e0fa3eace14661a8aed124c6e995 (diff)
move DisplaySink code out from yaxpeax-x86
it was built in-place around yaxpeax-x86, hoisted out once it seemed suitable and could be generalized. yay! also include a Makefile in yaxpeax-arch now to test that various crate feature flag combinations.. work.
Diffstat (limited to 'src/display.rs')
-rw-r--r--src/display.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/display.rs b/src/display.rs
index 789919e..77f6ba9 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -1,9 +1,32 @@
+// allow use of deprecated items in this module since some functions using `SignedHexDisplay` still
+// exist here
+#![allow(deprecated)]
+
use crate::YaxColors;
use core::fmt;
use core::num::Wrapping;
use core::ops::Neg;
+mod display_sink;
+
+pub use display_sink::{DisplaySink, FmtSink, InstructionTextSink};
+
+/// translate a byte in range `[0, 15]` to a lowercase base-16 digit.
+///
+/// if `c` is in range, the output is always valid as the sole byte in a utf-8 string. if `c` is out
+/// of range, the returned character might not be a valid single-byte utf-8 codepoint.
+fn u8_to_hex(c: u8) -> u8 {
+ // this conditional branch is faster than a lookup for... most architectures (especially x86
+ // with cmov)
+ if c < 10 {
+ b'0' + c
+ } else {
+ b'a' + c - 10
+ }
+}
+
+#[deprecated(since="0.3.0", note="format_number_i32 does not optimize as expected and will be removed in the future. see DisplaySink instead.")]
pub enum NumberStyleHint {
Signed,
HexSigned,
@@ -17,6 +40,7 @@ pub enum NumberStyleHint {
HexUnsignedWithSign
}
+#[deprecated(since="0.3.0", note="format_number_i32 is both slow and incorrect: YaxColors may not result in correct styling when writing anywhere other than a terminal, and both stylin and formatting does not inline as well as initially expected. see DisplaySink instead.")]
pub fn format_number_i32<W: fmt::Write, Y: YaxColors>(colors: &Y, f: &mut W, i: i32, hint: NumberStyleHint) -> fmt::Result {
match hint {
NumberStyleHint::Signed => {
@@ -64,6 +88,7 @@ pub fn format_number_i32<W: fmt::Write, Y: YaxColors>(colors: &Y, f: &mut W, i:
}
}
+#[deprecated(since="0.3.0", note="SignedHexDisplay does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub struct SignedHexDisplay<T: core::fmt::LowerHex + Neg> {
value: T,
negative: bool
@@ -79,6 +104,7 @@ impl<T: fmt::LowerHex + Neg + Copy> fmt::Display for SignedHexDisplay<T> where W
}
}
+#[deprecated(since="0.3.0", note="u8_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn u8_hex(value: u8) -> SignedHexDisplay<i8> {
SignedHexDisplay {
value: value as i8,
@@ -86,6 +112,7 @@ pub fn u8_hex(value: u8) -> SignedHexDisplay<i8> {
}
}
+#[deprecated(since="0.3.0", note="signed_i8_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn signed_i8_hex(imm: i8) -> SignedHexDisplay<i8> {
SignedHexDisplay {
value: imm,
@@ -93,6 +120,7 @@ pub fn signed_i8_hex(imm: i8) -> SignedHexDisplay<i8> {
}
}
+#[deprecated(since="0.3.0", note="u16_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn u16_hex(value: u16) -> SignedHexDisplay<i16> {
SignedHexDisplay {
value: value as i16,
@@ -100,6 +128,7 @@ pub fn u16_hex(value: u16) -> SignedHexDisplay<i16> {
}
}
+#[deprecated(since="0.3.0", note="signed_i16_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn signed_i16_hex(imm: i16) -> SignedHexDisplay<i16> {
SignedHexDisplay {
value: imm,
@@ -107,6 +136,7 @@ pub fn signed_i16_hex(imm: i16) -> SignedHexDisplay<i16> {
}
}
+#[deprecated(since="0.3.0", note="u32_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn u32_hex(value: u32) -> SignedHexDisplay<i32> {
SignedHexDisplay {
value: value as i32,
@@ -114,6 +144,7 @@ pub fn u32_hex(value: u32) -> SignedHexDisplay<i32> {
}
}
+#[deprecated(since="0.3.0", note="signed_i32_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn signed_i32_hex(imm: i32) -> SignedHexDisplay<i32> {
SignedHexDisplay {
value: imm,
@@ -121,6 +152,7 @@ pub fn signed_i32_hex(imm: i32) -> SignedHexDisplay<i32> {
}
}
+#[deprecated(since="0.3.0", note="u64_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn u64_hex(value: u64) -> SignedHexDisplay<i64> {
SignedHexDisplay {
value: value as i64,
@@ -128,6 +160,7 @@ pub fn u64_hex(value: u64) -> SignedHexDisplay<i64> {
}
}
+#[deprecated(since="0.3.0", note="signed_i64_hex does not optimize like expected and will be removed in the future. see DisplaySink instead.")]
pub fn signed_i64_hex(imm: i64) -> SignedHexDisplay<i64> {
SignedHexDisplay {
value: imm,