diff options
Diffstat (limited to 'chapter25/src/main/smp/sys/scan.smp')
| -rw-r--r-- | chapter25/src/main/smp/sys/scan.smp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/chapter25/src/main/smp/sys/scan.smp b/chapter25/src/main/smp/sys/scan.smp new file mode 100644 index 00000000..ba91003e --- /dev/null +++ b/chapter25/src/main/smp/sys/scan.smp @@ -0,0 +1,40 @@ +// -*- mode: java; -*- + +// Scanner; a simple string parser. +struct scan { + int !x; // Cursor + bool !bad; // True after a malformed token + u8[~] buf; // Buffer to parse + + 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( x >= buf# ) return false; + if( buf[x] != c ) return false; + x++; + return true; + }; + + // Parse a simple number + val number = { -> + skip(); + bool neg = match('-'); + if( x >= buf# || buf[x] < '0' || '9' < buf[x] ) { + bad = true; + return 0; + } + i64 n = 0; + while( x < buf# && '0' <= buf[x] & buf[x] <= '9' ) + n = n*10 + (buf[x++] - '0'); + return neg ? -n : n; + }; +}; |
