From f668640e3d9c4ccbd1fc0c6e98e1fb9c2cf1a39c Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Thu, 4 Nov 2021 18:30:39 +0100 Subject: [PATCH] move error handling to Prolog by using the new '$first_non_octet'/2 --- src/lib/charsio.pl | 5 ++++- src/lib/format.pl | 7 +++++++ src/machine/system_calls.rs | 24 ------------------------ 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/lib/charsio.pl b/src/lib/charsio.pl index 92d3c443..2109da50 100644 --- a/src/lib/charsio.pl +++ b/src/lib/charsio.pl @@ -239,7 +239,10 @@ chars_base64(Cs, Bs, Options) :- must_be_characters(Bs), '$chars_base64'(Cs, Bs, Padding, Charset) ; must_be_characters(Cs), - '$chars_base64'(Cs, Bs, Padding, Charset) + ( '$first_non_octet'(Cs, N) -> + domain_error(byte_char, N, chars_base64/3) + ; '$chars_base64'(Cs, Bs, Padding, Charset) + ) ). must_be_characters(Cs) :- diff --git a/src/lib/format.pl b/src/lib/format.pl index e8964304..db5eb48f 100644 --- a/src/lib/format.pl +++ b/src/lib/format.pl @@ -390,6 +390,13 @@ format(Fs, Args) :- format(Stream, Fs, Args) :- phrase(format_(Fs, Args), Cs), + ( stream_property(Stream, type(binary)) -> + ( '$first_non_octet'(Cs, N) -> + domain_error(byte_char, N, format/3) + ; true + ) + ; true + ), % we use a specialised internal predicate that uses only a % single "write" operation for efficiency. It is equivalent to % maplist(put_char(Stream), Cs). It also works for binary streams. diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index d8c835c6..3a12b8bc 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -2042,18 +2042,6 @@ impl MachineState { if stream.options().stream_type == StreamType::Binary { for c in string.chars() { - if c as u32 > 255 { - let stub = MachineError::functor_stub(clause_name!("$put_chars"), 2); - - let err = MachineError::type_error( - self.heap.h(), - ValidType::Byte, - Addr::Char(c), - ); - - return Err(self.error_form(err, stub)); - } - bytes.push(c as u8); } } else { @@ -5486,18 +5474,6 @@ impl MachineState { } else { let mut bytes = vec![]; for c in self.heap_pstr_iter(self[temp_v!(1)]).to_string().chars() { - if c as u32 > 255 { - let stub = MachineError::functor_stub(clause_name!("chars_base64"), 3); - - let err = MachineError::type_error( - self.heap.h(), - ValidType::Byte, - Addr::Char(c), - ); - - return Err(self.error_form(err, stub)); - } - bytes.push(c as u8); } let b64 = base64::encode_config(bytes, config); -- 2.54.0