summaryrefslogtreecommitdiff
path: root/contrib/one-true-awk
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2017-09-14 05:47:55 +0000
committerWarner Losh <imp@FreeBSD.org>2017-09-14 05:47:55 +0000
commit69679fc10f063232621951eefb5d4d5ca5ae4759 (patch)
treedf641ed9b07894d7eebbcfbe9f71d89048253317 /contrib/one-true-awk
parent83feae78cc82f825018395f60200374953d28337 (diff)
downloadsrc-test-69679fc10f063232621951eefb5d4d5ca5ae4759.tar.gz
src-test-69679fc10f063232621951eefb5d4d5ca5ae4759.zip
Bring in bit operation functions, ala gawk.
These are from OpenBSD: >>> Extend awk with bitwise operations. This is an extension to the awk >>> spec and documented as such, but comes in handy from time to time. >>> The prototypes make it compatible with a similar GNU awk extension. >>> >>> ok millert@, enthusiasm from deraadt@ Edited to fix cut and paste in error messages, as well as using tabs instead of spaces after #defines added. Obtained From: OpenBSD awk.h 1.12, lex.c 1.10, run.c 1.29 Differential Revision: https://reviews.freebsd.org/D12361 Sponsored by: Netflix
Notes
Notes: svn path=/head/; revision=323576
Diffstat (limited to 'contrib/one-true-awk')
-rw-r--r--contrib/one-true-awk/awk.h6
-rw-r--r--contrib/one-true-awk/lex.c6
-rw-r--r--contrib/one-true-awk/run.c58
3 files changed, 70 insertions, 0 deletions
diff --git a/contrib/one-true-awk/awk.h b/contrib/one-true-awk/awk.h
index a36cdb151e750..5564af7619a44 100644
--- a/contrib/one-true-awk/awk.h
+++ b/contrib/one-true-awk/awk.h
@@ -126,6 +126,12 @@ extern Cell *rlengthloc; /* RLENGTH */
#define FTOUPPER 12
#define FTOLOWER 13
#define FFLUSH 14
+#define FAND 15
+#define FFOR 16
+#define FXOR 17
+#define FCOMPL 18
+#define FLSHIFT 19
+#define FRSHIFT 20
/* Node: parse tree is made of nodes, with Cell's at bottom */
diff --git a/contrib/one-true-awk/lex.c b/contrib/one-true-awk/lex.c
index 0c65a9fe32920..3aeffb7f05390 100644
--- a/contrib/one-true-awk/lex.c
+++ b/contrib/one-true-awk/lex.c
@@ -47,9 +47,11 @@ Keyword keywords[] ={ /* keep sorted: binary searched */
{ "BEGIN", XBEGIN, XBEGIN },
{ "END", XEND, XEND },
{ "NF", VARNF, VARNF },
+ { "and", FAND, BLTIN },
{ "atan2", FATAN, BLTIN },
{ "break", BREAK, BREAK },
{ "close", CLOSE, CLOSE },
+ { "compl", FCOMPL, BLTIN },
{ "continue", CONTINUE, CONTINUE },
{ "cos", FCOS, BLTIN },
{ "delete", DELETE, DELETE },
@@ -69,13 +71,16 @@ Keyword keywords[] ={ /* keep sorted: binary searched */
{ "int", FINT, BLTIN },
{ "length", FLENGTH, BLTIN },
{ "log", FLOG, BLTIN },
+ { "lshift", FLSHIFT, BLTIN },
{ "match", MATCHFCN, MATCHFCN },
{ "next", NEXT, NEXT },
{ "nextfile", NEXTFILE, NEXTFILE },
+ { "or", FFOR, BLTIN },
{ "print", PRINT, PRINT },
{ "printf", PRINTF, PRINTF },
{ "rand", FRAND, BLTIN },
{ "return", RETURN, RETURN },
+ { "rshift", FRSHIFT, BLTIN },
{ "sin", FSIN, BLTIN },
{ "split", SPLIT, SPLIT },
{ "sprintf", SPRINTF, SPRINTF },
@@ -87,6 +92,7 @@ Keyword keywords[] ={ /* keep sorted: binary searched */
{ "tolower", FTOLOWER, BLTIN },
{ "toupper", FTOUPPER, BLTIN },
{ "while", WHILE, WHILE },
+ { "xor", FXOR, BLTIN },
};
#define RET(x) { if(dbg)printf("lex %s\n", tokname(x)); return(x); }
diff --git a/contrib/one-true-awk/run.c b/contrib/one-true-awk/run.c
index 1e5f1c25a69cf..ddc839e59717f 100644
--- a/contrib/one-true-awk/run.c
+++ b/contrib/one-true-awk/run.c
@@ -1516,6 +1516,64 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
nextarg = nextarg->nnext;
}
break;
+ case FCOMPL:
+ u = ~((int)getfval(x));
+ break;
+ case FAND:
+ if (nextarg == 0) {
+ 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;
+ break;
+ case FFOR:
+ if (nextarg == 0) {
+ 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;
+ break;
+ case FXOR:
+ if (nextarg == 0) {
+ 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;
+ break;
+ case FLSHIFT:
+ if (nextarg == 0) {
+ WARNING("lshift 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;
+ break;
+ case FRSHIFT:
+ if (nextarg == 0) {
+ WARNING("rshift 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;
+ break;
case FSYSTEM:
fflush(stdout); /* in case something is buffered already */
u = (Awkfloat) system(getsval(x)) / 256; /* 256 is unix-dep */