oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git
1,817 bytes raw
1
pub fn substitute(format: []const u8, value: []const u8, buffer: []u8) []const u8 {
2
    if (format.len == 0) {
3
        const len = @min(value.len, buffer.len);
4
        @memcpy(buffer[0..len], value[0..len]);
5
        return buffer[0..len];
6
    }
7
8
    var out_idx: usize = 0;
9
    var fmt_idx: usize = 0;
10
    while (fmt_idx < format.len and out_idx < buffer.len -| value.len) {
11
        if (fmt_idx + 1 < format.len and format[fmt_idx] == '{' and format[fmt_idx + 1] == '}') {
12
            @memcpy(buffer[out_idx .. out_idx + value.len], value);
13
            out_idx += value.len;
14
            fmt_idx += 2;
15
        } else {
16
            buffer[out_idx] = format[fmt_idx];
17
            out_idx += 1;
18
            fmt_idx += 1;
19
        }
20
    }
21
    return buffer[0..out_idx];
22
}
23
24
pub fn substitute_multi(format: []const u8, values: []const []const u8, buffer: []u8) []const u8 {
25
    if (format.len == 0 and values.len > 0) {
26
        const len = @min(values[0].len, buffer.len);
27
        @memcpy(buffer[0..len], values[0][0..len]);
28
        return buffer[0..len];
29
    }
30
31
    var out_idx: usize = 0;
32
    var fmt_idx: usize = 0;
33
    var val_idx: usize = 0;
34
    while (fmt_idx < format.len and out_idx < buffer.len - 20) {
35
        if (fmt_idx + 1 < format.len and format[fmt_idx] == '{' and format[fmt_idx + 1] == '}') {
36
            if (val_idx < values.len) {
37
                const value = values[val_idx];
38
                if (out_idx + value.len <= buffer.len) {
39
                    @memcpy(buffer[out_idx .. out_idx + value.len], value);
40
                    out_idx += value.len;
41
                }
42
                val_idx += 1;
43
            }
44
            fmt_idx += 2;
45
        } else {
46
            buffer[out_idx] = format[fmt_idx];
47
            out_idx += 1;
48
            fmt_idx += 1;
49
        }
50
    }
51
    return buffer[0..out_idx];
52
}