Implement gawk multiple-arg extension to and, or, and xor.
gawk allows multiple arguemnts to bit-wiste and, or and xor functions. Implement an arbitrary number of arguments for these functions. Also, use NULL in preference to 0 to match rest of file. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D12361
This commit is contained in:
parent
69679fc10f
commit
73f7ff91b2
@ -1476,7 +1476,7 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
|
||||
{
|
||||
Cell *x, *y;
|
||||
Awkfloat u;
|
||||
int t;
|
||||
int t, i;
|
||||
Awkfloat tmp;
|
||||
char *p, *buf;
|
||||
Node *nextarg;
|
||||
@ -1520,40 +1520,52 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
|
||||
u = ~((int)getfval(x));
|
||||
break;
|
||||
case FAND:
|
||||
if (nextarg == 0) {
|
||||
if (nextarg == NULL) {
|
||||
WARNING("and requires two arguments; returning 0");
|
||||
u = 0;
|
||||
break;
|
||||
}
|
||||
y = execute(a[1]->nnext);
|
||||
u = ((int)getfval(x)) & ((int)getfval(y));
|
||||
tempfree(y);
|
||||
nextarg = nextarg->nnext;
|
||||
i = ((int)getfval(x));
|
||||
while (nextarg != NULL) {
|
||||
y = execute(nextarg);
|
||||
i &= (int)getfval(y);
|
||||
tempfree(y);
|
||||
nextarg = nextarg->nnext;
|
||||
}
|
||||
u = i;
|
||||
break;
|
||||
case FFOR:
|
||||
if (nextarg == 0) {
|
||||
if (nextarg == NULL) {
|
||||
WARNING("or requires two arguments; returning 0");
|
||||
u = 0;
|
||||
break;
|
||||
}
|
||||
y = execute(a[1]->nnext);
|
||||
u = ((int)getfval(x)) | ((int)getfval(y));
|
||||
tempfree(y);
|
||||
nextarg = nextarg->nnext;
|
||||
i = ((int)getfval(x));
|
||||
while (nextarg != NULL) {
|
||||
y = execute(nextarg);
|
||||
i |= (int)getfval(y);
|
||||
tempfree(y);
|
||||
nextarg = nextarg->nnext;
|
||||
}
|
||||
u = i;
|
||||
break;
|
||||
case FXOR:
|
||||
if (nextarg == 0) {
|
||||
if (nextarg == NULL) {
|
||||
WARNING("xor requires two arguments; returning 0");
|
||||
u = 0;
|
||||
break;
|
||||
}
|
||||
y = execute(a[1]->nnext);
|
||||
u = ((int)getfval(x)) ^ ((int)getfval(y));
|
||||
tempfree(y);
|
||||
nextarg = nextarg->nnext;
|
||||
i = ((int)getfval(x));
|
||||
while (nextarg != NULL) {
|
||||
y = execute(nextarg);
|
||||
i ^= (int)getfval(y);
|
||||
tempfree(y);
|
||||
nextarg = nextarg->nnext;
|
||||
}
|
||||
u = i;
|
||||
break;
|
||||
case FLSHIFT:
|
||||
if (nextarg == 0) {
|
||||
if (nextarg == NULL) {
|
||||
WARNING("lshift requires two arguments; returning 0");
|
||||
u = 0;
|
||||
break;
|
||||
@ -1564,7 +1576,7 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
|
||||
nextarg = nextarg->nnext;
|
||||
break;
|
||||
case FRSHIFT:
|
||||
if (nextarg == 0) {
|
||||
if (nextarg == NULL) {
|
||||
WARNING("rshift requires two arguments; returning 0");
|
||||
u = 0;
|
||||
break;
|
||||
|
@ -690,12 +690,15 @@ and returns its exit status.
|
||||
.Bl -tag -width "lshift(a, b)"
|
||||
.It Fn compl x
|
||||
Returns the bitwise complement of integer argument x.
|
||||
.It Fn and x y
|
||||
Performs a bitwise AND on integer arguments x and y.
|
||||
.It Fn or x y
|
||||
Performs a bitwise OR on integer arguments x and y.
|
||||
.It Fn xor x y
|
||||
Performs a bitwise Exclusive-OR on integer arguments x and y.
|
||||
.It Fn and v1 v2 ...
|
||||
Performs a bitwise AND on all arguments provided, as integers.
|
||||
There must be at least two values.
|
||||
.It Fn or v1 v2 ...
|
||||
Performs a bitwise OR on all arguments provided, as integers.
|
||||
There must be at least two values.
|
||||
.It Fn xor v1 v2 ...
|
||||
Performs a bitwise Exclusive-OR on all arguments provided, as integers.
|
||||
There must be at least two values.
|
||||
.It Fn lshift x n
|
||||
Returns integer argument x shifted by n bits to the left.
|
||||
.It Fn rshift x n
|
||||
|
Loading…
Reference in New Issue
Block a user