diff options
| author | Cliff Click <cliffc@acm.org> | 2026-08-10 11:11:18 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-11-12 23:28:58 -0800 |
| commit | 2cb35c65bde63f90d7afc3d7a8a985b0c6ea15d7 (patch) | |
| tree | 50646613e551b1d4e523639d2973299c9d3bd5cd /src/main/smp/sys/ary.smp | |
| parent | 772e3a1036d571de55b178ebd6d11ee5140d4e36 (diff) | |
| download | Simple-2cb35c65bde63f90d7afc3d7a8a985b0c6ea15d7.tar.gz Simple-2cb35c65bde63f90d7afc3d7a8a985b0c6ea15d7.zip | |
Chapter 30: Text Formatting and Diagnostics
Co-authored-by: Hsiang-Ying Fu <66062782+fuhsnn@users.noreply.github.com>
Co-authored-by: fuhsnn <66062782+fuhsnn@users.noreply.github.com>
Co-authored-by: Symious <14933944+symious@users.noreply.github.com>
Co-authored-by: Jun Kawasaki <jun784@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'src/main/smp/sys/ary.smp')
| -rw-r--r-- | src/main/smp/sys/ary.smp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/main/smp/sys/ary.smp b/src/main/smp/sys/ary.smp index 8312e94c..c139cd33 100644 --- a/src/main/smp/sys/ary.smp +++ b/src/main/smp/sys/ary.smp @@ -1,11 +1,25 @@ // Array utilities +// Geometric growth without wrapping a u32 length. Zero means too large. +val capacity = { u32 current, i64 needed -> + if( needed < 0 || needed > 4294967295 ) return 0; + if( needed <= current ) return current; + i64 size = current ? current : 1; + while( size < needed ) { + size *= 2; + if( size > 4294967295 ) size = 4294967295; + } + u32 result = size; + return result; +}; + // Copy byte array contents. Copies the shorter of the buffers and len -val copy = { u8[] dst, int doff, u8[~] src, int soff, int len -> +val copy = { u8[] dst, u32 doff, u8[~] 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( int i=0; i<len; i++ ) + for( u32 i=0; i<len; i++ ) dst[i+doff] = src[i+soff]; return dst; }; @@ -14,10 +28,12 @@ val copy = { u8[] dst, int doff, u8[~] src, int soff, int len -> // len. Returns <0 or >0 for first non-matching byte. Returns <0 or >0 for // the larger array after that, or 0 if both arrays are fully equal. val cmp = { u8[~] src1, u32 off1, u8[~] src2, u32 off2, u32 len -> - u32 len1 = len > src1# - off1 ? src1# - off1 : len; - u32 len2 = len > src2# - off2 ? src2# - off2 : len; + u32 left1 = off1 >= src1# ? 0 : src1# - off1; + u32 left2 = off2 >= src2# ? 0 : src2# - off2; + u32 len1 = len > left1 ? left1 : len; + u32 len2 = len > left2 ? left2 : len; u32 max = len1 > len2 ? len2 : len1; - for( int i=0; i<max; i++ ) + for( u32 i=0; i<max; i++ ) if( src1[off1+i] != src2[off2+i] ) return src1[off1+i] - src2[off2+i]; // Bytes determine compare return len1 - len2; // Length determines compare |
