forc_debug/names.rs
1/// A list of predefined register names mapped to their corresponding indices.
2pub const REGISTERS: [&str; 16] = [
3 "zero", "one", "of", "pc", "ssp", "sp", "fp", "hp", "err", "ggas", "cgas", "bal", "is", "ret",
4 "retl", "flag",
5];
6
7/// Returns the name of a register given its index.
8///
9/// If the index corresponds to a predefined register, the corresponding name
10/// from `REGISTERS` is returned. Otherwise, it returns a formatted name
11/// like `"reg{index}"`.
12///
13/// # Examples
14///
15/// ```
16/// use forc_debug::names::register_name;
17/// assert_eq!(register_name(0), "zero".to_string());
18/// assert_eq!(register_name(15), "flag".to_string());
19/// ```
20pub fn register_name(index: usize) -> String {
21 if index < REGISTERS.len() {
22 REGISTERS[index].to_owned()
23 } else {
24 format!("reg{index}")
25 }
26}
27
28/// Returns the index of a register given its name.
29///
30/// If the name matches a predefined register in `REGISTERS`, the corresponding
31/// index is returned. Otherwise, returns `None`.
32///
33/// # Examples
34///
35/// ```
36/// use forc_debug::names::register_index;
37/// assert_eq!(register_index("zero"), Some(0));
38/// assert_eq!(register_index("flag"), Some(15));
39/// assert_eq!(register_index("unknown"), None);
40/// ```
41pub fn register_index(name: &str) -> Option<usize> {
42 REGISTERS.iter().position(|&n| n == name)
43}