svn commit: r323577 - in head: contrib/one-true-awk usr.bin/awk
Warner Losh
imp at FreeBSD.org
Thu Sep 14 05:48:24 UTC 2017
Author: imp
Date: Thu Sep 14 05:48:23 2017
New Revision: 323577
URL: https://svnweb.freebsd.org/changeset/base/323577
Log:
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
Modified:
head/contrib/one-true-awk/run.c
head/usr.bin/awk/awk.1
Modified: head/contrib/one-true-awk/run.c
==============================================================================
--- head/contrib/one-true-awk/run.c Thu Sep 14 05:47:55 2017 (r323576)
+++ head/contrib/one-true-awk/run.c Thu Sep 14 05:48:23 2017 (r323577)
@@ -1476,7 +1476,7 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0
{
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
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
nextarg = nextarg->nnext;
break;
case FRSHIFT:
- if (nextarg == 0) {
+ if (nextarg == NULL) {
WARNING("rshift requires two arguments; returning 0");
u = 0;
break;
Modified: head/usr.bin/awk/awk.1
==============================================================================
--- head/usr.bin/awk/awk.1 Thu Sep 14 05:47:55 2017 (r323576)
+++ head/usr.bin/awk/awk.1 Thu Sep 14 05:48:23 2017 (r323577)
@@ -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
More information about the svn-src-all
mailing list