From 56d148832e71af16dbd1546a9492ab36a631c455 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 12 Dec 2021 17:25:14 +0200 Subject: [PATCH] =?UTF-8?q?support=20unsorted=20argument=20for=20/?= =?UTF-8?q?=E2=81=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/sfns.c | 63 +++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 6b6d28c5..fe5a881a 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -585,11 +585,12 @@ B slash_im(B t, B x) { if (xia==0) { dec(x); return emptyIVec(); } switch(xe) { case el_i8: { - i8* xp = i8any_ptr(x); if(xp[0]<0) thrM("/⁼: Argument cannot contain negative numbers"); - bool bitres = true; - for (usz i = 1; i < xia; i++) if (xp[i-1]>=xp[i]) { bitres=false; if (xp[i-1]>xp[i]) thrM("/⁼: Argument must be sorted"); } - usz ria = 1 + (usz)xp[xia-1]; B r; - if (bitres) { + i8* xp = i8any_ptr(x); + usz i,j; B r; i8 max=-1; + for (i = 0; i < xia; i++) { i8 c=xp[i]; if (c<=max) break; max=c; } + for (j = i; j < xia; j++) { i8 c=xp[j]; max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); } + usz ria = max+1; + if (i==xia) { u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; i=xp[i]) { bitres=false; if (xp[i-1]>xp[i]) thrM("/⁼: Argument must be sorted"); } - usz ria = 1 + (usz)xp[xia-1]; B r; - if (bitres) { + i16* xp = i16any_ptr(x); + usz i,j; B r; i16 max=-1; + for (i = 0; i < xia; i++) { i16 c=xp[i]; if (c<=max) break; max=c; } + for (j = i; j < xia; j++) { i16 c=xp[j]; max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); } + usz ria = max+1; + if (i==xia) { u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; i=xp[i]) { bitres=false; if (xp[i-1]>xp[i]) thrM("/⁼: Argument must be sorted"); } - usz ria = 1 + (usz)xp[xia-1]; B r; - if (bitres) { + i32* xp = i32any_ptr(x); + usz i,j; B r; i32 max=-1; + for (i = 0; i < xia; i++) { i32 c=xp[i]; if (c<=max) break; max=c; } + for (j = i; j < xia; j++) { i32 c=xp[j]; max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); } + usz ria = max+1; + if (i==xia) { u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; i=xp[i]) { bitres=false; if (xp[i-1]>xp[i]) thrM("/⁼: Argument must be sorted"); } - } - usz ria = 1 + (usz)xp[xia-1]; B r; - if (bitres) { + f64* xp = f64any_ptr(x); + usz i,j; B r; f64 max=-1; + for (i = 0; i < xia; i++) { f64 c=xp[i]; if (c!=(usz)c) thrM("/⁼: Argument must consist of natural numbers"); if (c<=max) break; max=c; } + for (j = i; j < xia; j++) { f64 c=xp[j]; if (c!=(usz)c) thrM("/⁼: Argument must consist of natural numbers"); max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); } + usz ria = max+1; if (ria==0) thrOOM(); + if (i==xia) { u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; ia; } - i64 prev = o2i64(xp[0]); - if(prev<0) thrM("/⁼: Argument cannot contain negative numbers"); - bool bitres = true; - for (usz i = 1; i < xia; i++) { - i64 c = o2i64(xp[i]); - if (prev>=c) { bitres=false; if (prev>c) thrM("/⁼: Argument must be sorted"); } - prev = c; - } - usz ria = prev+1; B r; - if (bitres) { + usz i,j; B r; i64 max=-1; + for (i = 0; i < xia; i++) { usz c=o2s(xp[i]); if (c!=(usz)c) thrM("/⁼: Argument must consist of natural numbers"); if (c<=max) break; max=c; } + for (j = i; j < xia; j++) { usz c=o2s(xp[j]); if (c!=(usz)c) thrM("/⁼: Argument must consist of natural numbers"); max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); } + usz ria = max+1; if (ria==0) thrOOM(); + if (i==xia) { u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; i