1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
// Author: cirakg & claude ai
// Summary: Small string helpers for parsing: trimming, clipping for messages, integer parsing, case-insensitive search.
import Toybox.Lang;
module Text {
// Text without leading and trailing spaces, tabs and line breaks.
function trim(text as String) as String {
var chars = text.toCharArray();
var start = 0;
var end = chars.size();
while (start < end && isSpace(chars[start])) {
start++;
}
while (end > start && isSpace(chars[end - 1])) {
end--;
}
return start == 0 && end == chars.size() ? text : text.substring(start, end) as String;
}
function isSpace(c as Char) as Boolean {
return c == ' ' || c == '\t' || c == '\n' || c == '\r';
}
// At most maxChars characters, with "…" when shortened (for messages that
// quote user input).
function clip(text as String, maxChars as Number) as String {
return text.length() <= maxChars ? text : (text.substring(0, maxChars) as String) + "…";
}
// A non-negative decimal integer (at most 18 digits), or null.
function parseLong(text as String) as Long? {
var chars = text.toCharArray();
if (chars.size() == 0 || chars.size() > 18) {
return null;
}
var value = 0l;
for (var i = 0; i < chars.size(); i++) {
var c = chars[i];
if (c < '0' || c > '9') {
return null;
}
value = value * 10 + (c.toNumber() - 48);
}
return value;
}
// Index of needle in haystack ignoring ASCII case, from `from`, or -1.
function findIgnoreCase(haystack as String, needle as String, from as Number) as Number {
var lower = haystack.toLower();
var rest = from == 0 ? lower : lower.substring(from, lower.length()) as String;
var at = rest.find(needle.toLower());
return at == null ? -1 : at + from;
}
}
|