From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=DATE_IN_PAST_24_48, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 32247 invoked from network); 21 May 2023 13:57:09 -0000 Received: from 9front.inri.net (168.235.81.73) by inbox.vuxu.org with ESMTPUTF8; 21 May 2023 13:57:09 -0000 Received: from one.net.tachibana-labs.org ([78.141.198.89]) by 9front; Sun May 21 09:52:41 -0400 2023 Received: from kijetesantakalu (cpc99362-croy26-2-0-cust24.19-2.cable.virginm.net [80.195.49.25]) by one.net.tachibana-labs.org (OpenSMTPD) with ESMTPSA id f0f039fe (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO) for <9front@9front.org>; Sun, 21 May 2023 13:52:40 +0000 (UTC) Message-ID: From: mia soweli Date: Sat, 20 May 2023 01:04:26 +0000 To: 9front@9front.org MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: social extended SQL over WEB2.0 realtime-java base polling database Subject: [9front] [PATCH] libaml: implement ConcatRes and Mid opcodes. Reply-To: 9front@9front.org Precedence: bulk ConcatRes concatenates two resources, and appends the end tag. Mid takes the substring of a string or buffer. --- diff 4c533e7c453a5b48b1bb4088f2f7fdb6df6a48c2 f27164167a90a7bc8613375a2d90f2438625518b --- a/sys/src/libaml/aml.c +++ b/sys/src/libaml/aml.c @@ -150,7 +150,7 @@ Oindex, Omatch, Omutex, Oevent, Ocfld, Ocfld0, Ocfld1, Ocfld2, Ocfld4, Ocfld8, Oif, Oelse, Owhile, Obreak, Oret, Ocall, - Ostore, Oderef, Ootype, Osize, Oref, Ocref, Ocat, + Ostore, Oderef, Ootype, Osize, Oref, Ocref, Ocat, Ocatr, Omid, Oacq, Osignal, Orel, Ostall, Osleep, Oload, Ounload, Otodec, Otohex, Otoint, Otostr, }; @@ -1711,6 +1711,66 @@ } static void* +evalcatres(void) +{ + void *r, *a, *b; + int n, m; + uchar c[2]; + + a = FP->arg[0]; + b = FP->arg[1]; + if(a == nil) + a = copy('b', a); + if(b == nil) + b = copy('b', b); + if(TAG(a) != 'b' || TAG(b) != 'b') + return nil; + + n = SIZE(a); + m = SIZE(b); + r = mk('b', n + m + 2); + memmove(r, a, n); + memmove((uchar*)r + n, b, m); + + c[0] = ResEnd; + c[1] = 0; + memmove((uchar*)r + n + m, c, 2); + + store(r, FP->arg[2]); + return r; +} + +static void* +evalmid(void) +{ + void *r, *a; + int n, m; + + a = FP->arg[1]; + n = ival(FP->arg[1]); + m = ival(FP->arg[2]); + if(a == nil) + a = copy('b', a); + + switch(TAG(a)) { + default: + return nil; /* botch */ + case 's': + case 'b': + if(n > SIZE(a)) + n = SIZE(a); + if((n + m) > SIZE(a)) + m = SIZE(a) - n; + + r = mk(TAG(a), m); memmove(r, (uchar*)a + n, m); + break; + } + + store(r, FP->arg[3]); + return r; +} + +static void* evalindex(void) { Field *f; @@ -2150,6 +2210,8 @@ [Ocref] "CondRefOf", "@@", evalcondref, [Oderef] "DerefOf", "@", evalderef, [Ocat] "Concatenate", "**@", evalcat, + [Ocatr] "ConcatenateRes", "***", evalcatres, + [Omid] "Mid", "*ii@", evalmid, [Oacq] "Acquire", "@2", evalnop, [Osignal] "Signal", "@", evalnop, @@ -2182,10 +2244,10 @@ /* 68 */ Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Obad, /* 70 */ Ostore, Oref, Oadd, Ocat, Osub, Oinc, Odec, Omul, /* 78 */ Odiv, Oshl, Oshr, Oand, Onand, Oor, Onor, Oxor, -/* 80 */ Onot, Olbit, Orbit, Oderef, Obad, Omod, Obad, Osize, +/* 80 */ Onot, Olbit, Orbit, Oderef, Ocatr, Omod, Obad, Osize, /* 88 */ Oindex, Omatch, Ocfld4, Ocfld2, Ocfld1, Ocfld0, Ootype, Ocfld8, /* 90 */ Oland, Olor, Olnot, Oleq, Olgt, Ollt, Obad, Otodec, -/* 98 */ Otohex, Otoint, Obad, Obad, Otostr, Obad, Obad, Obad, +/* 98 */ Otohex, Otoint, Obad, Obad, Otostr, Obad, Omid, Obad, /* A0 */ Oif, Oelse, Owhile, Onop, Oret, Obreak, Obad, Obad, /* A8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad, /* B0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,