summaryrefslogtreecommitdiff
path: root/sys/src/cmd/pc.y
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2016-09-01 10:55:12 +0000
committeraiju <devnull@localhost>2016-09-01 10:55:12 +0000
commit30c9e34c0d0a0247b0adb2c343e30240ed0e2779 (patch)
tree51a51efcc952dd424c47090c85547ca9b5ca23b5 /sys/src/cmd/pc.y
parentd552fed38514dc799c7fea95dfb632c8816c3f60 (diff)
pc: add cat() function
Diffstat (limited to 'sys/src/cmd/pc.y')
-rw-r--r--sys/src/cmd/pc.y31
1 files changed, 31 insertions, 0 deletions
diff --git a/sys/src/cmd/pc.y b/sys/src/cmd/pc.y
index 0f456a6eb..b47cdd5f0 100644
--- a/sys/src/cmd/pc.y
+++ b/sys/src/cmd/pc.y
@@ -836,6 +836,36 @@ fnrev(int, Num **a)
return a[0];
}
+Num *
+fncat(int n, Num **a)
+{
+ int i, w;
+ Num *r;
+
+ if(n % 2 != 0){
+ error("cat: odd number of arguments");
+ i = 0;
+ fail:
+ for(; i < n; i++)
+ numdecref(a[i]);
+ return nil;
+ }
+ r = numalloc();
+ for(i = 0; i < n; i += 2){
+ if(toint(a[i+1], &w, 1)) goto fail;
+ mpleft(r, w, r);
+ if(a[i]->sign < 0 || mpsignif(a[i]) > w){
+ a[i] = nummod(a[i]);
+ mptrunc(a[i], w, a[i]);
+ }
+ r->b = basemax(r->b, a[i]->b);
+ mpor(r, a[i], r);
+ numdecref(a[i]);
+ numdecref(a[i+1]);
+ }
+ return r;
+}
+
void
main(int argc, char **argv)
{
@@ -863,6 +893,7 @@ main(int argc, char **argv)
regfunc("minv", fnminv, 2);
regfunc("rand", fnrand, 1);
regfunc("rev", fnrev, 2);
+ regfunc("cat", fncat, -1);
prompt = 1;
ARGBEGIN{