summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2021-10-17 18:45:05 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2021-10-17 18:45:05 +0000
commitd0909089b28d28ea54c6451d94434fda8b0c1780 (patch)
treec2f09d8f323782f0c76bd561d317fd7b8318eff0
parent72d08816abaa2935e8055d9cdfd73b59df5f9bd3 (diff)
libaml: implement ToString instruction
-rw-r--r--sys/src/libaml/aml.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/src/libaml/aml.c b/sys/src/libaml/aml.c
index 73b22524a..16da37e70 100644
--- a/sys/src/libaml/aml.c
+++ b/sys/src/libaml/aml.c
@@ -152,7 +152,7 @@ enum {
Oif, Oelse, Owhile, Obreak, Oret, Ocall,
Ostore, Oderef, Osize, Oref, Ocref, Ocat,
Oacq, Osignal, Orel, Ostall, Osleep, Oload, Ounload,
- Otodec, Otohex, Otoint,
+ Otodec, Otohex, Otoint, Otostr,
};
static Op optab[];
@@ -2012,6 +2012,27 @@ evalconv(void)
return r;
}
+static void*
+evaltostr(void)
+{
+ char *buf, *r, *e;
+ int len;
+
+ buf = FP->arg[0];
+ if(buf == nil || (TAG(buf) != 'b' && TAG(buf) != 's'))
+ buf = copy('b', buf);
+ len = ival(FP->arg[1]);
+ if(~len == 0 || len > SIZE(buf))
+ len = SIZE(buf);
+ if(len > 0 && (e = memchr(buf, 0, len)) != nil)
+ len = e - buf;
+ r = mk('s', len+1);
+ r[len] = '\0';
+ memmove(r, buf, len);
+ store(r, FP->arg[2]);
+ return r;
+}
+
static Op optab[] = {
[Obad] "", "", evalbad,
[Onop] "Noop", "", evalnop,
@@ -2110,6 +2131,7 @@ static Op optab[] = {
[Otodec] "ToDecimalString", "*@", evalconv,
[Otohex] "ToHexString", "*@", evalconv,
[Otoint] "ToInteger", "*@", evalconv,
+ [Otostr] "ToString", "*i@", evaltostr,
};
static uchar octab1[] = {
@@ -2132,7 +2154,7 @@ static uchar octab1[] = {
/* 80 */ Onot, Olbit, Orbit, Oderef, Obad, Omod, Obad, Osize,
/* 88 */ Oindex, Omatch, Ocfld4, Ocfld2, Ocfld1, Ocfld0, Obad, Ocfld8,
/* 90 */ Oland, Olor, Olnot, Oleq, Olgt, Ollt, Obad, Otodec,
-/* 98 */ Otohex, Otoint, Obad, Obad, Obad, Obad, Obad, Obad,
+/* 98 */ Otohex, Otoint, Obad, Obad, Otostr, Obad, Obad, 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,