-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathregisters.rs
102 lines (90 loc) · 3.92 KB
/
registers.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use std::path::PathBuf;
use std::sync::atomic::Ordering;
use super::{add_deref_to_span, apply_val_color, ORANGE, PURPLE, RED};
use log::debug;
use ratatui::prelude::Stylize;
use ratatui::text::{Line, Span, Text};
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::{layout::Rect, style::Style, Frame};
use crate::register::RegisterStorage;
use crate::App;
/// Registers
pub fn draw_registers(app: &App, f: &mut Frame, register: Rect) {
let block = Block::default().borders(Borders::TOP).title("Registers".fg(ORANGE));
let mut lines = vec![];
let mut longest_register_name = 0;
let mut longest_extra_val = 0;
if let Ok(regs) = app.registers.lock() {
if regs.is_empty() {
f.render_widget(block, register);
return;
}
// find longest register name
// TODO: cache this
let reg_changed_lock = app.register_changed.lock().unwrap();
let filepath_lock = app.filepath.lock().unwrap();
for RegisterStorage { name, register, deref: _ } in regs.iter() {
if let Some(reg) = register {
if !reg.is_set() {
continue;
}
if let Some(reg_value) = ®.value {
if let Ok(_) = u64::from_str_radix(®_value[2..], 16) {
if longest_register_name < name.len() {
longest_register_name = name.len();
}
}
}
}
}
let width: usize = if app.thirty_two_bit.load(Ordering::Relaxed) { 11 } else { 19 };
let empty = PathBuf::from("");
let binding = filepath_lock.as_ref().unwrap_or(&empty);
let filepath = binding.to_string_lossy();
for (i, RegisterStorage { name, register, deref }) in regs.iter().enumerate() {
if let Some(reg) = register {
if !reg.is_set() {
continue;
}
if let Some(reg_value) = ®.value {
if let Ok(val) = u64::from_str_radix(®_value[2..], 16) {
let changed = reg_changed_lock.contains(&(i as u8));
let mut reg_name =
Span::from(format!(" {name:width$}", width = longest_register_name))
.style(Style::new().fg(PURPLE));
let (is_stack, is_heap, is_text) = app.classify_val(val, &filepath);
let mut extra_derefs = Vec::new();
add_deref_to_span(
deref,
&mut extra_derefs,
app,
&filepath,
&mut longest_extra_val,
width,
);
let hex_string = format!("{}", reg.value.as_ref().unwrap());
let hex_width = hex_string.len();
let padding_width = width.saturating_sub(hex_width);
let mut span = Span::from(format!(
"→ {}{:padding$}",
hex_string,
"",
padding = padding_width
));
apply_val_color(&mut span, is_stack, is_heap, is_text);
// Apply color to reg name
if changed {
reg_name = reg_name.style(Style::new().fg(RED));
}
let mut line = Line::from(vec![reg_name, span]);
line.spans.append(&mut extra_derefs);
lines.push(line);
}
}
}
}
}
let text = Text::from(lines);
let paragraph = Paragraph::new(text).block(block);
f.render_widget(paragraph, register);
}