diff options
| author | Cliff Click <cliffc@acm.org> | 2026-10-24 15:23:20 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-10-24 15:23:20 -0700 |
| commit | f49b184a093ab5f653ac36ccc4939c45515a2f4b (patch) | |
| tree | 36b7b0b688a6b03ceb1412fc45f79f32e7540002 /chapter28b/src/main/smp/sys/scan.smp | |
| parent | a216a23bbd4d6e05a40d86ec8e76c038e945f3ba (diff) | |
| download | Simple-f49b184a093ab5f653ac36ccc4939c45515a2f4b.tar.gz Simple-f49b184a093ab5f653ac36ccc4939c45515a2f4b.zip | |
Move combined chapter 25 baseline to chapter 28b
Diffstat (limited to 'chapter28b/src/main/smp/sys/scan.smp')
| -rw-r--r-- | chapter28b/src/main/smp/sys/scan.smp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/chapter28b/src/main/smp/sys/scan.smp b/chapter28b/src/main/smp/sys/scan.smp new file mode 100644 index 00000000..44bedaaa --- /dev/null +++ b/chapter28b/src/main/smp/sys/scan.smp @@ -0,0 +1,39 @@ + +// 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; + }; +}; |
