aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/text.c41
-rw-r--r--stdlib/text.h1
2 files changed, 42 insertions, 0 deletions
diff --git a/stdlib/text.c b/stdlib/text.c
index 384bf7ac..57a98e8d 100644
--- a/stdlib/text.c
+++ b/stdlib/text.c
@@ -572,6 +572,47 @@ public Text_t Text$to(Text_t text, Int_t last)
return Text$slice(text, I_small(1), last);
}
+public Text_t Text$reversed(Text_t text)
+{
+ switch (text.tag) {
+ case TEXT_SHORT_ASCII: {
+ Text_t ret = text;
+ for (int64_t i = 0; i < text.length; i++)
+ ret.short_ascii[text.length-1-i] = text.short_ascii[i];
+ return ret;
+ }
+ case TEXT_ASCII: {
+ Text_t ret = text;
+ ret.ascii = GC_MALLOC_ATOMIC(sizeof(uint8_t[text.length]));
+ for (int64_t i = 0; i < text.length; i++)
+ ((char*)ret.ascii)[text.length-1-i] = text.ascii[i];
+ return ret;
+ }
+ case TEXT_SHORT_GRAPHEMES: {
+ Text_t ret = text;
+ for (int64_t i = 0; i < text.length; i++)
+ ret.short_graphemes[text.length-1-i] = text.short_graphemes[i];
+ return ret;
+ }
+ case TEXT_GRAPHEMES: {
+ Text_t ret = text;
+ ret.graphemes = GC_MALLOC_ATOMIC(sizeof(int32_t[text.length]));
+ for (int64_t i = 0; i < text.length; i++)
+ ((int32_t*)ret.graphemes)[text.length-1-i] = text.graphemes[i];
+ return ret;
+ }
+ case TEXT_SUBTEXT: {
+ Text_t ret = text;
+ int64_t n = num_subtexts(text);
+ ret.subtexts = GC_MALLOC(sizeof(Text_t*[n]));
+ for (int64_t i = 0; i < n; i++)
+ ret.subtexts[n-1-i] = Text$reversed(text.subtexts[i]);
+ return ret;
+ }
+ default: errx(1, "Invalid tag");
+ }
+}
+
public Text_t Text$cluster(Text_t text, Int_t index_int)
{
int64_t index = Int_to_Int64(index_int, false);
diff --git a/stdlib/text.h b/stdlib/text.h
index 6e2ac413..f7785ddb 100644
--- a/stdlib/text.h
+++ b/stdlib/text.h
@@ -31,6 +31,7 @@ Text_t Text$_concat(int n, Text_t items[n]);
Text_t Text$slice(Text_t text, Int_t first_int, Int_t last_int);
Text_t Text$from(Text_t text, Int_t first);
Text_t Text$to(Text_t text, Int_t last);
+Text_t Text$reversed(Text_t text);
Text_t Text$cluster(Text_t text, Int_t index_int);
OptionalText_t Text$from_str(const char *str);
OptionalText_t Text$from_strn(const char *str, size_t len);