diff options
| author | Cliff Click <cliffc@acm.org> | 2026-08-10 11:11:18 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-08-10 15:21:17 -0700 |
| commit | 28209703c72fb7e9955961dbdb84e24a0f871acd (patch) | |
| tree | 8e4df2c1a5e6811696b454bbc4d7cd1cc30e42e7 /src/main/smp/sys/Scan.smp | |
| parent | e57bdd315a7918a0d130e1c95648ca4a1b4f08ed (diff) | |
| download | Simple-28209703c72fb7e9955961dbdb84e24a0f871acd.tar.gz Simple-28209703c72fb7e9955961dbdb84e24a0f871acd.zip | |
Chapter 25: Moduleslinear-chapter25
Diffstat (limited to 'src/main/smp/sys/Scan.smp')
| -rw-r--r-- | src/main/smp/sys/Scan.smp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/main/smp/sys/Scan.smp b/src/main/smp/sys/Scan.smp new file mode 100644 index 00000000..acf366f7 --- /dev/null +++ b/src/main/smp/sys/Scan.smp @@ -0,0 +1,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; + }; +}; |
