From 3047ff48b51eb5ab5374e5d9a9eab86bc412e25c Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 17 May 2023 21:45:47 +0300 Subject: [PATCH] =?UTF-8?q?Add=20rank=20checks=20to=20=E2=80=A2FChars=20&?= =?UTF-8?q?=20=E2=80=A2FLines=20&=20=E2=80=A2FBytes=20&=20=E2=80=A2Out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit & clean up terminology --- include/bqnffi.h | 2 +- src/builtins/sysfn.c | 31 +++++++++++++++---------------- src/utils/file.c | 6 +++--- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/include/bqnffi.h b/include/bqnffi.h index ad3d02cb..87812199 100644 --- a/include/bqnffi.h +++ b/include/bqnffi.h @@ -29,7 +29,7 @@ BQNV bqn_call1(BQNV f, BQNV x); BQNV bqn_call2(BQNV f, BQNV w, BQNV x); // Evaluate BQN code in a fresh environment -BQNV bqn_eval(BQNV src); // src must be a character vector +BQNV bqn_eval(BQNV src); // src must be a list of characters BQNV bqn_evalCStr(const char* str); // evaluates the null-terminated UTF8-encoded str; equal to `BQNV s = bqn_makeUTF8Str(strlen(str), str); result = bqn_eval(s); bqn_free(s);` diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index 026ea316..2ee00341 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -28,7 +28,7 @@ static bool eqStr(B w, u32* x) { B type_c1(B t, B x) { i32 r = -1; - if (isArr(x)) r = 0; + if (isArr(x)) r = 0; else if (isF64(x)) r = 1; else if (isC32(x)) r = 2; else if (isFun(x)) r = 3; @@ -251,8 +251,7 @@ B casrt_c1(B t, B x) { B sys_c1(B t, B x); B out_c1(B t, B x) { - if (isAtm(x)) thrM("•Out: Argument must be a list"); - if (RNK(x)>1) thrF("•Out: Argument cannot have rank %i", RNK(x)); + if (isAtm(x) || RNK(x)!=1) thrM("•Out: Argument must be a string"); printsB(x); putchar('\n'); return x; } @@ -270,11 +269,11 @@ B show_c1(B t, B x) { } B vfyStr(B x, char* name, char* arg) { - if (isAtm(x) || RNK(x)!=1) thrF("%U: %U must be a character vector", name, arg); + if (isAtm(x) || RNK(x)!=1) thrF("%U: %U must be a string", name, arg); if (!elChr(TI(x,elType))) { usz ia = IA(x); SGetU(x) - for (usz i = 0; i < ia; i++) if (!isC32(GetU(x,i))) thrF("%U: %U must be a character vector", name, arg); + for (usz i = 0; i < ia; i++) if (!isC32(GetU(x,i))) thrF("%U: %U must be a string", name, arg); } return x; } @@ -728,7 +727,7 @@ B fchars_c1(B d, B x) { return path_chars(path_rel(nfn_objU(d), x)); } B fchars_c2(B d, B w, B x) { - if (!isArr(x)) thrM("•FChars: Non-array 𝕩"); + if (isAtm(x) || RNK(x)!=1) thrM("•file.Chars: 𝕩 must be a list of characters"); B p = path_rel(nfn_objU(d), w); path_wChars(incG(p), x); dec(x); @@ -744,7 +743,7 @@ B fbytes_c1(B d, B x) { return r; } B fbytes_c2(B d, B w, B x) { - if (!isArr(x)) thrM("•FBytes: Non-array 𝕩"); + if (isAtm(x) || RNK(x)!=1) thrM("•file.Bytes: 𝕩 must be a list"); B p = path_rel(nfn_objU(d), w); path_wBytes(incG(p), x); dec(x); @@ -755,13 +754,13 @@ B flines_c1(B d, B x) { return path_lines(path_rel(nfn_objU(d), x)); } B flines_c2(B d, B w, B x) { - if (!isArr(x)) thrM("•FLines: Non-array 𝕩"); + if (isAtm(x) || RNK(x)!=1) thrM("•file.Lines: 𝕩 must be a list"); B nl, s = emptyCVec(); usz ia = IA(x); SGet(x) for (u64 i = 0; i < ia; i++) { nl = Get(x, i); - if (!isArr(nl)) thrM("•FLines: Non-array element of 𝕩"); + if (isAtm(s) || RNK(s)!=1) thrM("•file.Lines: Elements of 𝕩 must be lists of characters"); s = vec_join(s, nl); //if (windows) s = vec_add(s, m_c32('\r')); TODO figure out whether or not this is a thing that should be done s = vec_addN(s, m_c32('\n')); @@ -877,11 +876,11 @@ B fexists_c1(B d, B x) { } B fName_c1(B t, B x) { - if (!isArr(x) || RNK(x)!=1) thrM("•file.Name: Argument must be a character vector"); + if (isAtm(x) || RNK(x)!=1) thrM("•file.Name: Argument must be a string"); return path_name(x); } B fParent_c1(B t, B x) { - if (!isArr(x) || RNK(x)!=1) thrM("•file.Parent: Argument must be a character vector"); + if (isAtm(x) || RNK(x)!=1) thrM("•file.Parent: Argument must be a string"); return path_parent(x); } @@ -932,7 +931,7 @@ B getLine_c1(B t, B x) { } B fromUtf8_c1(B t, B x) { - if (!isArr(x)) thrM("•FromUTF8: Argument must be a character or number array"); + if (isAtm(x) || RNK(x)!=1) thrM("•FromUTF8: Argument must be a character or number list"); usz ia = IA(x); TALLOC(char, chrs, ia); SGetU(x) @@ -944,7 +943,7 @@ B fromUtf8_c1(B t, B x) { chrs[i] = v; } else { i32 v = o2i(c); - if (v<=-128 | v>=256) thrF("•FromUTF8: Argument contained %i", v); + if (v<=-128 | v>=256) thrF("•FromUTF8: Argument contained the number %i", v); chrs[i] = v&0xff; } } @@ -955,7 +954,7 @@ B fromUtf8_c1(B t, B x) { } B toUtf8_c1(B t, B x) { - if (!isArr(x)) thrM("•ToUTF8: Argument must be a character or number array"); + if (isAtm(x) || RNK(x)!=1) thrM("•ToUTF8: Argument must be a character or number list"); u64 len = utf8lenB(x); u8* rp; B r = m_c8arrv(&rp, len); toUTF8(x, (char*)rp); @@ -1165,12 +1164,12 @@ B tFlush_c1(B t, B x) { return x; } B tOutRaw_c1(B t, B x) { - if (isAtm(x)) thrM("•term.OutRaw: 𝕩 must be an array"); + if (isAtm(x) || RNK(x)!=1) thrM("•term.OutRaw: 𝕩 must be a list"); file_wBytes(stdout, bi_N, x); return x; } B tErrRaw_c1(B t, B x) { - if (isAtm(x)) thrM("•term.ErrRaw: 𝕩 must be an array"); + if (isAtm(x) || RNK(x)!=1) thrM("•term.ErrRaw: 𝕩 must be a list"); file_wBytes(stderr, bi_N, x); return x; } diff --git a/src/utils/file.c b/src/utils/file.c index b4b6f8f6..289a8f04 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -118,16 +118,16 @@ static NOINLINE void guaranteeStr(B x) { // assumes x is an array if (elChr(TI(x,elType))) return; usz xia = IA(x); SGetU(x) - for (usz i = 0; i < xia; i++) if (!isC32(GetU(x, i))) thrM("Paths must be character vectors"); + for (usz i = 0; i < xia; i++) if (!isC32(GetU(x, i))) thrM("Path wasn't a list of characters"); } B path_rel(B base, B rel) { // consumes rel; assumes base is a char vector or bi_N assert(isArr(base) || q_N(base)); - if (!isArr(rel) || RNK(rel)!=1) thrM("Paths must be character vectors"); + if (!isArr(rel) || RNK(rel)!=1) thrM("Path wasn't a list of characters"); SGetU(rel) usz ria = IA(rel); - if (RNK(rel)!=1) thrM("Paths must be character vectors"); + if (RNK(rel)!=1) thrM("Path wasn't a list of characters"); guaranteeStr(rel); if (ria>0 && isAbsolutePath(rel)) return rel; if (q_N(base)) thrM("Using relative path with no absolute base path known");