summaryrefslogtreecommitdiff
path: root/chapter25/src/main/smp/sys/Scan.smp
blob: acf366f70f36a9706c246e632f24c23dccb27a90 (plain)
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
// -*- mode: java;  -*-

// Scanner; a simple string parser.
struct Scan {
    int !x;                     // Cursor
    u8[~] buf;                  // Immutable byte array, must be set in 2nd constructor

    new Scan = { u8[~] b ->
        buf = b;
    };

    // Skip whitespace
    val skip = { ->
        while( x < buf# && buf[x] <= ' ' )
            x++;
        return self;
    };

    // True if find required character, and skip it; else False.
    val match = { u8 c ->
        skip();
        if( buf[x] != c ) return false;
        x++;
        return true;
    };

    // Parse a simple number
    val number = { ->
        skip();
        bool neg = match('-');
        i64 n = 0;
        while( '0' <= buf[x] & buf[x] <= '9' )
            n = n*10 + (buf[x++] - '0');
        return neg ? -n : n;
    };
};