move error handling to Prolog by using the new '$first_non_octet'/2
This commit is contained in:
@@ -239,7 +239,10 @@ chars_base64(Cs, Bs, Options) :-
|
|||||||
must_be_characters(Bs),
|
must_be_characters(Bs),
|
||||||
'$chars_base64'(Cs, Bs, Padding, Charset)
|
'$chars_base64'(Cs, Bs, Padding, Charset)
|
||||||
; must_be_characters(Cs),
|
; 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) :-
|
must_be_characters(Cs) :-
|
||||||
|
|||||||
@@ -390,6 +390,13 @@ format(Fs, Args) :-
|
|||||||
|
|
||||||
format(Stream, Fs, Args) :-
|
format(Stream, Fs, Args) :-
|
||||||
phrase(format_(Fs, Args), Cs),
|
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
|
% we use a specialised internal predicate that uses only a
|
||||||
% single "write" operation for efficiency. It is equivalent to
|
% single "write" operation for efficiency. It is equivalent to
|
||||||
% maplist(put_char(Stream), Cs). It also works for binary streams.
|
% maplist(put_char(Stream), Cs). It also works for binary streams.
|
||||||
|
|||||||
@@ -2042,18 +2042,6 @@ impl MachineState {
|
|||||||
|
|
||||||
if stream.options().stream_type == StreamType::Binary {
|
if stream.options().stream_type == StreamType::Binary {
|
||||||
for c in string.chars() {
|
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);
|
bytes.push(c as u8);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -5486,18 +5474,6 @@ impl MachineState {
|
|||||||
} else {
|
} else {
|
||||||
let mut bytes = vec![];
|
let mut bytes = vec![];
|
||||||
for c in self.heap_pstr_iter(self[temp_v!(1)]).to_string().chars() {
|
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);
|
bytes.push(c as u8);
|
||||||
}
|
}
|
||||||
let b64 = base64::encode_config(bytes, config);
|
let b64 = base64::encode_config(bytes, config);
|
||||||
|
|||||||
Reference in New Issue
Block a user