summaryrefslogtreecommitdiff
path: root/source/util/Text.mc
blob: 9af7b321c3a3b82374e741b837a8b830c75f772e (plain) (blame)
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;
    }
}