[m-rev.] for review: Simplify string.append(in, out, in) implementation.

Mark Brown mark at mercurylang.org
Wed Oct 23 20:28:16 AEDT 2019


This looks fine.

On Wed, Oct 23, 2019 at 3:02 PM Peter Wang <novalazy at gmail.com> wrote:
>
> library/string.m:
>     Replace foreign code implementations with Mercury code.
> ---
>  library/string.m | 55 ++++++++++--------------------------------------
>  1 file changed, 11 insertions(+), 44 deletions(-)
>
> diff --git a/library/string.m b/library/string.m
> index eb13c4f8f..96566a3dc 100644
> --- a/library/string.m
> +++ b/library/string.m
> @@ -3617,50 +3617,17 @@ append(S1::out, S2::out, S3::in) :-
>
>  :- pred append_ioi(string::in, string::uo, string::in) is semidet.
>
> -:- pragma foreign_proc("C",
> -    append_ioi(S1::in, S2::uo, S3::in),
> -    [will_not_call_mercury, promise_pure, thread_safe, will_not_modify_trail,
> -        does_not_affect_liveness, no_sharing],
> -"{
> -    size_t len_1, len_2, len_3;
> -
> -    len_1 = strlen(S1);
> -    if (strncmp(S1, S3, len_1) != 0) {
> -        SUCCESS_INDICATOR = MR_FALSE;
> -    } else {
> -        len_3 = strlen(S3);
> -        len_2 = len_3 - len_1;
> -        // We need to make a copy to ensure that the pointer is word-aligned.
> -        MR_allocate_aligned_string_msg(S2, len_2, MR_ALLOC_ID);
> -        strcpy(S2, S3 + len_1);
> -        SUCCESS_INDICATOR = MR_TRUE;
> -    }
> -}").
> -:- pragma foreign_proc("C#",
> -    append_ioi(S1::in, S2::uo, S3::in),
> -    [will_not_call_mercury, promise_pure, thread_safe],
> -"{
> -    if (S3.StartsWith(S1)) {
> -        // .Substring() better?
> -        S2 = S3.Remove(0, S1.Length);
> -        SUCCESS_INDICATOR = true;
> -    } else {
> -        S2 = null;
> -        SUCCESS_INDICATOR = false;
> -    }
> -}").
> -:- pragma foreign_proc("Java",
> -    append_ioi(S1::in, S2::uo, S3::in),
> -    [will_not_call_mercury, promise_pure, thread_safe],
> -"
> -    if (S3.startsWith(S1)) {
> -        S2 = S3.substring(S1.length());
> -        SUCCESS_INDICATOR = true;
> -    } else {
> -        S2 = null;
> -        SUCCESS_INDICATOR = false;
> -    }
> -").
> +append_ioi(S1, S2, S3) :-
> +    Len1 = length(S1),
> +    Len3 = length(S3),
> +    ( if
> +        Len1 =< Len3,
> +        unsafe_compare_substrings((=), S1, 0, S3, 0, Len1)
> +    then
> +        unsafe_between(S3, Len1, Len3, S2)
> +    else
> +        fail
> +    ).
>
>  :- pred append_iio(string::in, string::in, string::uo) is det.
>
> --
> 2.23.0
>
> _______________________________________________
> reviews mailing list
> reviews at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/reviews


More information about the reviews mailing list