diff options
author | dzaima <dzaimagit@gmail.com> | 2024-04-03 05:59:20 +0300 |
---|---|---|
committer | dzaima <dzaimagit@gmail.com> | 2024-04-03 05:59:35 +0300 |
commit | c1157f89a6a1013b2d8171c577f0b23957d92821 (patch) | |
tree | c4e6fae399b1b10ce8c5e407a23d2ed2b6958738 | |
parent | 55f7baf894c5186cd23ea56e92870d41f09af131 (diff) |
fix GroupLen properly
-rw-r--r-- | src/builtins/sysfn.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index a4893b3a..5c34ee89 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -150,22 +150,21 @@ B fill_c2(B t, B w, B x) { // TODO not set fill for typed arrays return x; } -B grLen_both(i64 ria, B x) { +B grLen_both(i64 ria, B x) { // assumes integer x + B r; usz ia = IA(x); - if (ia==0) return taga(arr_shVec(allZeroes(ria<=0? 0 : ria))); + if (ia==0) { + r = taga(arr_shVec(allZeroes(ria<=0? 0 : ria))); + goto r_r; + } SGetU(x) f64 xmaxf = -1; for (usz i = 0; i < ia; i++) { f64 c = o2fG(GetU(x, i)); if (c>xmaxf) xmaxf = c; } - if (xmaxf >= USZ_MAX) thrOOM(); - if ((i64)xmaxf > ria) { - ria = (i64)xmaxf; - if (ria >= (i64)USZ_MAX) thrOOM(); - } - ria++; - B r; + if (xmaxf >= USZ_MAX-1) thrOOM(); + if ((i64)xmaxf > ria-1) ria = 1 + (i64)xmaxf; { u64* rp; r = m_bitarrv(&rp, ria); for (usz i = 0; i < BIT_N(ria); i++) rp[i] = 0; @@ -187,8 +186,8 @@ B grLen_both(i64 ria, B x) { } r_r: decG(x); return r; } -B grLen_c1(B t, B x) { return grLen_both( -1, x); } // assumes valid arguments -B grLen_c2(B t, B w, B x) { return grLen_both(o2i64G(w)-1, x); } // assumes valid arguments +B grLen_c1(B t, B x) { return grLen_both( 0, x); } +B grLen_c2(B t, B w, B x) { return grLen_both(o2i64G(w), x); } B grOrd_c2(B t, B w, B x) { // assumes valid arguments usz wia = IA(w); |