From ef92ddc69e7fec28d61ffc29f8d7edc800dac6a4 Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 11 Aug 2021 00:22:59 +0300 Subject: [PATCH] =?UTF-8?q?=E2=80=A2FromUTF8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/sysfn.c | 24 ++++++++++++++++++++++++ src/utils/builtins.h | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index 7e5bca36..8ebb9510 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -466,6 +466,29 @@ B getLine_c1(B t, B x) { return r; } +B fromUtf8_c1(B t, B x) { + if (!isArr(x)) thrM("•FromUTF8: Argument must be a character or number array"); + usz ia = a(x)->ia; + TALLOC(char, chrs, ia); + BS2B xgetU = TI(x,getU); + for (u64 i = 0; i < ia; i++) { + B c = xgetU(x,i); + if (isC32(c)) { + u32 v = o2cu(c); + if (v>=256) thrF("•FromUTF8: Argument contained a character with codepoint %i", v); + chrs[i] = v; + } else { + i32 v = o2i(c); + if (v<=-128 | v>=256) thrF("•FromUTF8: Argument contained %i", v); + chrs[i] = v&0xff; + } + } + B r = fromUTF8(chrs, ia); + dec(x); + TFREE(chrs); + return r; +} + B getInternalNS(void); B getMathNS(void); @@ -504,6 +527,7 @@ B sys_c1(B t, B x) { else if (eqStr(c, U"repr")) r.a[i] = inc(bi_repr); else if (eqStr(c, U"glyph")) r.a[i] = inc(bi_glyph); else if (eqStr(c, U"makerand")) r.a[i] = inc(bi_makeRand); + else if (eqStr(c, U"fromutf8")) r.a[i] = inc(bi_fromUtf8); else if (eqStr(c, U"fchars")) r.a[i] = m_nfn(fCharsDesc, path_dir(inc(comp_currPath))); else if (eqStr(c, U"fbytes")) r.a[i] = m_nfn(fBytesDesc, path_dir(inc(comp_currPath))); else if (eqStr(c, U"flines")) r.a[i] = m_nfn(fLinesDesc, path_dir(inc(comp_currPath))); diff --git a/src/utils/builtins.h b/src/utils/builtins.h index 4dc69b3a..f8eeb0d8 100644 --- a/src/utils/builtins.h +++ b/src/utils/builtins.h @@ -8,7 +8,7 @@ /* sort.c*/A(gradeUp,"⍋") A(gradeDown,"⍒") \ /* everything before the definition of •Type is defined to be pure, and everything after is not */ \ /* sysfn.c*/M(type,"•Type") M(decp,"•Decompose") M(primInd,"•PrimInd") M(glyph,"•Glyph") A(fill,"•FillFn") M(sys,"•getsys") A(grLen,"•GroupLen") D(grOrd,"•groupOrd") \ -/* sysfn.c*/M(repr,"•Repr") A(asrt,"!") A(casrt,"!") M(out,"•Out") M(show,"•Show") M(bqn,"•BQN") \ +/* sysfn.c*/M(repr,"•Repr") A(asrt,"!") A(casrt,"!") M(out,"•Out") M(show,"•Show") M(bqn,"•BQN") M(fromUtf8,"•FromUTF8") \ /* sysfn.c*/D(cmp,"•Cmp") A(hash,"•Hash") M(delay,"•Delay") M(makeRand,"•MakeRand") M(exit,"•Exit") M(getLine,"•GetLine") \ /*internal.c*/M(itype,"•internal.Type") M(refc,"•internal.Refc") M(squeeze,"•internal.Squeeze") M(isPure,"•internal.IsPure") A(info,"•internal.Info") \ /*internal.c*/D(variation,"•internal.Variation") A(listVariations,"•internal.ListVariations") M(clearRefs,"•internal.ClearRefs") M(unshare,"•internal.Unshare")