From 57c4a243b8cfb06dc7644f9c317ddc270cbbf0d3 Mon Sep 17 00:00:00 2001 From: Jon French Date: Tue, 16 Oct 2018 14:52:01 +0100 Subject: Re-implement space-related mapping functions in Sail rather than backends Uses new primop 'string_take' which is much easier to implement in e.g. C --- lib/sail.c | 18 ++++++++++++++++++ lib/sail.h | 1 + 2 files changed, 19 insertions(+) (limited to 'lib') diff --git a/lib/sail.c b/lib/sail.c index 9b7a1696..94cd5c2c 100644 --- a/lib/sail.c +++ b/lib/sail.c @@ -151,7 +151,25 @@ void string_drop(sail_string *dst, sail_string s, sail_int ns) *dst = realloc(*dst, (len - n) + 1); memcpy(*dst, s + n, len - n); (*dst)[len - n] = '\0'; + } else { + *dst = realloc(*dst, 1); + **dst = '\0'; + } +} + +void string_take(sail_string *dst, sail_string s, sail_int ns) +{ + size_t len = strlen(s); + mach_int n = CREATE_OF(mach_int, sail_int)(ns); + mach_int to_copy; + if (len <= n) { + to_copy = len; + } else { + to_copy = n; } + *dst = realloc(*dst, to_copy + 1); + memcpy(*dst, s, to_copy); + *dst[to_copy] = '\0'; } /* ***** Sail integers ***** */ diff --git a/lib/sail.h b/lib/sail.h index 598ac67d..4ccd8b93 100644 --- a/lib/sail.h +++ b/lib/sail.h @@ -327,6 +327,7 @@ void random_real(real *rop, unit); void string_length(sail_int *len, sail_string s); void string_drop(sail_string *dst, sail_string s, sail_int len); +void string_take(sail_string *dst, sail_string s, sail_int len); /* ***** Printing ***** */ -- cgit v1.2.3