summaryrefslogtreecommitdiff
path: root/src/main/smp/sys/Scan.smp
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-08-10 11:11:18 -0700
committerCliff Click <cliffc@acm.org>2026-08-10 15:21:17 -0700
commit28209703c72fb7e9955961dbdb84e24a0f871acd (patch)
tree8e4df2c1a5e6811696b454bbc4d7cd1cc30e42e7 /src/main/smp/sys/Scan.smp
parente57bdd315a7918a0d130e1c95648ca4a1b4f08ed (diff)
downloadSimple-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.smp36
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;
+ };
+};