diff options
| author | Jon French | 2018-10-16 14:52:01 +0100 |
|---|---|---|
| committer | Jon French | 2018-10-16 14:52:01 +0100 |
| commit | 57c4a243b8cfb06dc7644f9c317ddc270cbbf0d3 (patch) | |
| tree | 52f4617ad4c795abddc80bd6fb84ead026828f2d /lib | |
| parent | e7ca37271e187f36527a85bba31c60e0854bc8b7 (diff) | |
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
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sail.c | 18 | ||||
| -rw-r--r-- | lib/sail.h | 1 |
2 files changed, 19 insertions, 0 deletions
@@ -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 ***** */ @@ -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 ***** */ |
