summaryrefslogtreecommitdiff
path: root/chapter30/src/main/smp/sys/aryi64.smp
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-11-08 14:10:02 -0800
committerCliff Click <cliffc@acm.org>2026-11-08 14:10:02 -0800
commit06fb5aceeb65a75b1cd643debd667c52fdcafcb9 (patch)
treec99813eaf27d98f840245302c4d6e923c964307e /chapter30/src/main/smp/sys/aryi64.smp
parent6560a92433a38825fd1d44d9c66ffba9f26990ff (diff)
downloadSimple-ch30.tar.gz
Simple-ch30.zip
Better error messagesch30
Better error messages. Buffs to the std lib; getch() to fetch a single character; streaming I/O handles retries, and large sizes, with better error reporting. Formatted strings. Default int moved to i32. TicTacToe, the game.
Diffstat (limited to 'chapter30/src/main/smp/sys/aryi64.smp')
-rw-r--r--chapter30/src/main/smp/sys/aryi64.smp25
1 files changed, 14 insertions, 11 deletions
diff --git a/chapter30/src/main/smp/sys/aryi64.smp b/chapter30/src/main/smp/sys/aryi64.smp
index 98b72605..b9f1fbed 100644
--- a/chapter30/src/main/smp/sys/aryi64.smp
+++ b/chapter30/src/main/smp/sys/aryi64.smp
@@ -9,36 +9,36 @@ struct aryi64 {
};
// Grow as needed
- val _grow = { int len2 ->
- if( len+len2 < buf# ) return self;
- int newlen = buf# * 2;
- while( len+len2 >= newlen ) newlen *= 2;
+ val _grow = { u32 len2 ->
+ if( len+len2 <= buf# ) return self;
+ u32 newlen = ary.capacity(buf#,len+len2);
+ if( !newlen ) libc._exit(1); // Length exceeds the array representation.
i64[] !buf2 = new i64[newlen];
- for( int i=0; i<buf#; i++ )
+ for( u32 i=0; i<len; i++ )
buf2[i] = buf[i];
buf = buf2;
self;
};
- // Add a i64 to aryu8
+ // Add an i64 to aryi64
val add = { i64 c ->
_grow(1).buf[len++] = c;
self;
};
- val get = { int index -> return buf[index]; };
+ val get = { u32 index -> return buf[index]; };
// Write the bracketed array-list form to aryu8.
val str = { ->
// TODO: clunky default constructor syntax
var str = new aryu8().add('[');
- for( int i=0; i<len; i++ )
+ for( u32 i=0; i<len; i++ )
str.num(buf[i]).add(',').add(' ');
if( len ) str.undo(2);
return str.add(']');
};
- val swap = { int i, int j ->
+ val swap = { u32 i, u32 j ->
i64 tmp = buf[i];
buf[i] = buf[j];
buf[j] = tmp;
@@ -75,8 +75,11 @@ val parseAryI64 = { u8[~] str ->
return s.x == s.buf# ? nums : null;
};
-val copy = { i64[] dst, int doff, i64[~] src, int soff, int len ->
- for( int i=0; i<len; i++ )
+val copy = { i64[] dst, u32 doff, i64[~] src, u32 soff, u32 len ->
+ if( doff > dst# || soff > src# ) return dst;
+ if( len > dst# - doff ) len = dst# - doff;
+ if( len > src# - soff ) len = src# - soff;
+ for( u32 i=0; i<len; i++ )
dst[i+doff] = src[i+soff];
return dst;
};