aboutsummaryrefslogtreecommitdiff
path: root/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'builtins')
-rw-r--r--builtins/text.c15
-rw-r--r--builtins/text.h1
2 files changed, 16 insertions, 0 deletions
diff --git a/builtins/text.c b/builtins/text.c
index b4246980..9a9c3801 100644
--- a/builtins/text.c
+++ b/builtins/text.c
@@ -124,6 +124,21 @@ public uint32_t Text$hash(const CORD *cord)
return hash;
}
+public CORD Text$slice(CORD text, int64_t first, int64_t length)
+{
+ if (length == 0) return CORD_EMPTY;
+ int64_t len = CORD_len(text);
+
+ if (length < -len) return CORD_EMPTY;
+
+ if (first <= 0) first = len + first + 1;
+ if (first < 1) first = 1;
+ else if (first > len + 1) first = len + 1;
+
+ if (length < 0) length = len + length;
+ return CORD_substr(text, first - 1, length);
+}
+
public CORD Text$upper(CORD str)
{
if (!str) return str;
diff --git a/builtins/text.h b/builtins/text.h
index 3cda9d7b..cd191cb6 100644
--- a/builtins/text.h
+++ b/builtins/text.h
@@ -23,6 +23,7 @@ CORD Text$quoted(CORD str, bool colorize);
int Text$compare(const CORD *x, const CORD *y);
bool Text$equal(const CORD *x, const CORD *y);
uint32_t Text$hash(const CORD *cord);
+CORD Text$slice(CORD text, int64_t first, int64_t length);
CORD Text$upper(CORD str);
CORD Text$lower(CORD str);
CORD Text$title(CORD str);