pc: add cat() function
This commit is contained in:
parent
d552fed385
commit
30c9e34c0d
2 changed files with 34 additions and 0 deletions
|
@ -93,6 +93,9 @@ The minimum number of bits required to represent \fIn\fR as an unsigned number.
|
||||||
.I sbits(n)
|
.I sbits(n)
|
||||||
The minimum number of bits required to represent \fIn\fR as an signed number.
|
The minimum number of bits required to represent \fIn\fR as an signed number.
|
||||||
.TP
|
.TP
|
||||||
|
.I cat(a0,n0,...,aN,nN)
|
||||||
|
Truncate each of the \fIa\fR arguments to \fIn\fR bits and concatenate their binary representation.
|
||||||
|
.TP
|
||||||
.I gcd(n,m)
|
.I gcd(n,m)
|
||||||
The greatest common divisor of \fIn\fR and \fIm\fR.
|
The greatest common divisor of \fIn\fR and \fIm\fR.
|
||||||
.TP
|
.TP
|
||||||
|
|
|
@ -836,6 +836,36 @@ fnrev(int, Num **a)
|
||||||
return a[0];
|
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
|
void
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -863,6 +893,7 @@ main(int argc, char **argv)
|
||||||
regfunc("minv", fnminv, 2);
|
regfunc("minv", fnminv, 2);
|
||||||
regfunc("rand", fnrand, 1);
|
regfunc("rand", fnrand, 1);
|
||||||
regfunc("rev", fnrev, 2);
|
regfunc("rev", fnrev, 2);
|
||||||
|
regfunc("cat", fncat, -1);
|
||||||
|
|
||||||
prompt = 1;
|
prompt = 1;
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
|
|
Loading…
Reference in a new issue