diff options
author | aiju <devnull@localhost> | 2016-09-01 10:55:12 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2016-09-01 10:55:12 +0000 |
commit | 30c9e34c0d0a0247b0adb2c343e30240ed0e2779 (patch) | |
tree | 51a51efcc952dd424c47090c85547ca9b5ca23b5 /sys/src/cmd/pc.y | |
parent | d552fed38514dc799c7fea95dfb632c8816c3f60 (diff) |
pc: add cat() function
Diffstat (limited to 'sys/src/cmd/pc.y')
-rw-r--r-- | sys/src/cmd/pc.y | 31 |
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{ |