correct char_type/2 (#2132)

This commit is contained in:
Mark
2023-10-24 15:35:37 -06:00
parent f80dff851b
commit f10d7c05f9

View File

@@ -2929,95 +2929,92 @@ impl Machine {
} }
); );
self.machine_st.fail = true; // This predicate fails by default.
read_heap_cell!(a2, read_heap_cell!(a2,
(HeapCellValueTag::Atom, (chars, _arity)) => { (HeapCellValueTag::Atom, (chars, _arity)) => {
macro_rules! macro_check { self.machine_st.fail = true; // This predicate fails by default.
($id:ident, $name:expr) => { macro_rules! macro_check {
if $id!(c) && chars == $name { ($id:ident, $name:expr) => {
self.machine_st.fail = false; if $id!(c) && chars == $name {
return; self.machine_st.fail = false;
return;
}
};
} }
};
}
macro_rules! method_check { macro_rules! method_check {
($id:ident, $name:expr) => { ($id:ident, $name:expr) => {
if c.$id() && chars == $name { if c.$id() && chars == $name {
self.machine_st.fail = false; self.machine_st.fail = false;
return; return;
}
};
} }
};
}
macro_check!(alpha_char, atom!("alpha")); macro_check!(alpha_char, atom!("alpha"));
method_check!(is_alphabetic, atom!("alphabetic")); method_check!(is_alphabetic, atom!("alphabetic"));
method_check!(is_alphanumeric, atom!("alphanumeric")); method_check!(is_alphanumeric, atom!("alphanumeric"));
macro_check!(alpha_numeric_char, atom!("alnum")); macro_check!(alpha_numeric_char, atom!("alnum"));
method_check!(is_ascii, atom!("ascii")); method_check!(is_ascii, atom!("ascii"));
method_check!(is_ascii_punctuation, atom!("ascii_punctuation")); method_check!(is_ascii_punctuation, atom!("ascii_punctuation"));
method_check!(is_ascii_graphic, atom!("ascii_graphic")); method_check!(is_ascii_graphic, atom!("ascii_graphic"));
// macro_check!(backslash_char, atom!("backslash")); // macro_check!(backslash_char, atom!("backslash"));
// macro_check!(back_quote_char, atom!("back_quote")); // macro_check!(back_quote_char, atom!("back_quote"));
macro_check!(binary_digit_char, atom!("binary_digit")); macro_check!(binary_digit_char, atom!("binary_digit"));
// macro_check!(capital_letter_char, atom!("upper")); // macro_check!(capital_letter_char, atom!("upper"));
// macro_check!(comment_1_char, "comment_1"); // macro_check!(comment_1_char, "comment_1");
// macro_check!(comment_2_char, "comment_2"); // macro_check!(comment_2_char, "comment_2");
method_check!(is_control, atom!("control")); method_check!(is_control, atom!("control"));
// macro_check!(cut_char, atom!("cut")); // macro_check!(cut_char, atom!("cut"));
macro_check!(decimal_digit_char, atom!("decimal_digit")); macro_check!(decimal_digit_char, atom!("decimal_digit"));
// macro_check!(decimal_point_char, atom!("decimal_point")); // macro_check!(decimal_point_char, atom!("decimal_point"));
// macro_check!(double_quote_char, atom!("double_quote")); // macro_check!(double_quote_char, atom!("double_quote"));
macro_check!(exponent_char, atom!("exponent")); macro_check!(exponent_char, atom!("exponent"));
macro_check!(graphic_char, atom!("graphic")); macro_check!(graphic_char, atom!("graphic"));
macro_check!(graphic_token_char, atom!("graphic_token")); macro_check!(graphic_token_char, atom!("graphic_token"));
macro_check!(hexadecimal_digit_char, atom!("hexadecimal_digit")); macro_check!(hexadecimal_digit_char, atom!("hexadecimal_digit"));
macro_check!(layout_char, atom!("layout")); macro_check!(layout_char, atom!("layout"));
method_check!(is_lowercase, atom!("lower")); method_check!(is_lowercase, atom!("lower"));
macro_check!(meta_char, atom!("meta")); macro_check!(meta_char, atom!("meta"));
// macro_check!(new_line_char, atom!("new_line")); // macro_check!(new_line_char, atom!("new_line"));
method_check!(is_numeric, atom!("numeric")); method_check!(is_numeric, atom!("numeric"));
macro_check!(octal_digit_char, atom!("octal_digit")); macro_check!(octal_digit_char, atom!("octal_digit"));
macro_check!(octet_char, atom!("octet")); macro_check!(octet_char, atom!("octet"));
macro_check!(prolog_char, atom!("prolog")); macro_check!(prolog_char, atom!("prolog"));
// macro_check!(semicolon_char, atom!("semicolon")); // macro_check!(semicolon_char, atom!("semicolon"));
macro_check!(sign_char, atom!("sign")); macro_check!(sign_char, atom!("sign"));
// macro_check!(single_quote_char, atom!("single_quote")); // macro_check!(single_quote_char, atom!("single_quote"));
// macro_check!(small_letter_char, atom!("lower")); // macro_check!(small_letter_char, atom!("lower"));
macro_check!(solo_char, atom!("solo")); macro_check!(solo_char, atom!("solo"));
// macro_check!(space_char, atom!("space")); // macro_check!(space_char, atom!("space"));
macro_check!(symbolic_hexadecimal_char, atom!("symbolic_hexadecimal")); macro_check!(symbolic_hexadecimal_char, atom!("symbolic_hexadecimal"));
macro_check!(symbolic_control_char, atom!("symbolic_control")); macro_check!(symbolic_control_char, atom!("symbolic_control"));
method_check!(is_uppercase, atom!("upper")); method_check!(is_uppercase, atom!("upper"));
// macro_check!(variable_indicator_char, atom!("variable_indicator")); // macro_check!(variable_indicator_char, atom!("variable_indicator"));
method_check!(is_whitespace, atom!("whitespace")); method_check!(is_whitespace, atom!("whitespace"));
} }
(HeapCellValueTag::Str, s) => { (HeapCellValueTag::Str, s) => {
let (name, arity) = cell_as_atom_cell!(self.machine_st.heap[s]) let (name, arity) = cell_as_atom_cell!(self.machine_st.heap[s])
.get_name_and_arity(); .get_name_and_arity();
match (name, arity) { match (name, arity) {
(atom!("to_upper"), 1) => { (atom!("to_upper"), 1) => {
let reg = self.machine_st.deref(self.machine_st.heap[s+1]); let reg = self.machine_st.deref(self.machine_st.heap[s+1]);
let atom = AtomTable::build_with(&self.machine_st.atom_tbl, &c.to_uppercase().to_string()); let atom = AtomTable::build_with(&self.machine_st.atom_tbl, &c.to_uppercase().to_string());
let upper_str = string_as_cstr_cell!(atom); let upper_str = string_as_cstr_cell!(atom);
unify!(self.machine_st, reg, upper_str); unify!(self.machine_st, reg, upper_str);
self.machine_st.fail = false; }
(atom!("to_lower"), 1) => {
let reg = self.machine_st.deref(self.machine_st.heap[s+1]);
let atom = AtomTable::build_with(&self.machine_st.atom_tbl, &c.to_lowercase().to_string());
let lower_str = string_as_cstr_cell!(atom);
unify!(self.machine_st, reg, lower_str);
}
_ => {
unreachable!()
}
} }
(atom!("to_lower"), 1) => {
let reg = self.machine_st.deref(self.machine_st.heap[s+1]);
let atom = AtomTable::build_with(&self.machine_st.atom_tbl, &c.to_lowercase().to_string());
let lower_str = string_as_cstr_cell!(atom);
unify!(self.machine_st, reg, lower_str);
self.machine_st.fail = false;
}
_ => {
unreachable!()
}
};
} }
_ => { _ => {
unreachable!() unreachable!()
} }
); );