From: Markus Triska Date: Thu, 4 Nov 2021 17:30:39 +0000 (+0100) Subject: move error handling to Prolog by using the new '$first_non_octet'/2 X-Git-Tag: v0.9.0~36^2~1 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=f668640e3d9c4ccbd1fc0c6e98e1fb9c2cf1a39c;p=scryer-prolog.git move error handling to Prolog by using the new '$first_non_octet'/2 --- 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);