Module Name:    othersrc
Committed By:   agc
Date:           Thu Sep  1 05:07:13 UTC 2011

Modified Files:
        othersrc/external/historical/eawk/dist: awkgram.y lex.c proctab.c
            proto.h run.c
        othersrc/external/historical/eawk/eawk: Makefile expected

Log Message:
add bit arithmetic operations to eawk (implementation based on the gawk
man page). this provides:

        and(x, y)       (in C, x & y)
        or(x, y)        (in C, x | y)
        xor(x, y)       (in C, x ^ y)
        lshift(x, n)    (in C, x << n)
        rshift(x, n)    (in C, x >> n)
        compl(x)        (in C, ~x)

operations, with exactly the same calling conventions as gawk.


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 othersrc/external/historical/eawk/dist/awkgram.y \
    othersrc/external/historical/eawk/dist/lex.c \
    othersrc/external/historical/eawk/dist/proctab.c \
    othersrc/external/historical/eawk/dist/proto.h
cvs rdiff -u -r1.2 -r1.3 othersrc/external/historical/eawk/dist/run.c
cvs rdiff -u -r1.1.1.1 -r1.2 othersrc/external/historical/eawk/eawk/Makefile \
    othersrc/external/historical/eawk/eawk/expected

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: othersrc/external/historical/eawk/dist/awkgram.y
diff -u othersrc/external/historical/eawk/dist/awkgram.y:1.1.1.1 othersrc/external/historical/eawk/dist/awkgram.y:1.2
--- othersrc/external/historical/eawk/dist/awkgram.y:1.1.1.1	Wed Aug 31 04:19:39 2011
+++ othersrc/external/historical/eawk/dist/awkgram.y	Thu Sep  1 05:07:12 2011
@@ -96,6 +96,8 @@
 %right	POWER
 %right	DECR INCR
 %left	INDIRECT
+%token	<i> BITCOMPL BITLSHIFT BITRSHIFT BITAND BITOR BITXOR
+%type	<i> bitop
 %token	LASTTOKEN	/* must be last */
 
 %%
@@ -354,6 +356,9 @@
 	  SUB | GSUB
 	;
 
+bitop:
+	  BITLSHIFT | BITRSHIFT | BITAND | BITOR | BITXOR 
+	;
 term:
  	  term '/' ASGNOP term		{ $$ = eawk_op2(eawk, DIVEQ, $1, $4); }
  	| term '+' term			{ $$ = eawk_op2(eawk, ADD, $1, $3); }
@@ -446,6 +451,10 @@
 		{ $$ = eawk_op3(eawk, SUBSTR, $3, $5, $7); }
 	| SUBSTR '(' pattern comma pattern ')'
 		{ $$ = eawk_op3(eawk, SUBSTR, $3, $5, NIL); }
+	| BITCOMPL '(' pattern ')'
+		{ $$ = eawk_op1(eawk, BITCOMPL, $3); }
+	| bitop '(' pattern comma pattern ')'
+		{ $$ = eawk_op2(eawk, $1, $3, (awknode_t*)$5); }
 	| var
 	;
 
Index: othersrc/external/historical/eawk/dist/lex.c
diff -u othersrc/external/historical/eawk/dist/lex.c:1.1.1.1 othersrc/external/historical/eawk/dist/lex.c:1.2
--- othersrc/external/historical/eawk/dist/lex.c:1.1.1.1	Wed Aug 31 04:19:40 2011
+++ othersrc/external/historical/eawk/dist/lex.c	Thu Sep  1 05:07:12 2011
@@ -45,9 +45,11 @@
 	{ "BEGIN",	XBEGIN,		XBEGIN },
 	{ "END",	XEND,		XEND },
 	{ "NF",		VARNF,		VARNF },
+	{ "and",	BITAND,		BITAND },
 	{ "atan2",	FATAN,		BLTIN },
 	{ "break",	BREAK,		BREAK },
 	{ "close",	CLOSE,		CLOSE },
+	{ "compl",	BITCOMPL,	BITCOMPL },
 	{ "continue",	CONTINUE,	CONTINUE },
 	{ "cos",	FCOS,		BLTIN },
 	{ "delete",	DELETE,		DELETE },
@@ -75,13 +77,16 @@
 	{ "int",	FINT,		BLTIN },
 	{ "length",	FLENGTH,	BLTIN },
 	{ "log",	FLOG,		BLTIN },
+	{ "lshift",	BITLSHIFT,	BITLSHIFT },
 	{ "match",	MATCHFCN,	MATCHFCN },
 	{ "next",	NEXT,		NEXT },
 	{ "nextfile",	NEXTFILE,	NEXTFILE },
+	{ "or",		BITOR,		BITOR },
 	{ "print",	PRINT,		PRINT },
 	{ "printf",	PRINTF,		PRINTF },
 	{ "rand",	FRAND,		BLTIN },
 	{ "return",	RETURN,		RETURN },
+	{ "rshift",	BITRSHIFT,	BITRSHIFT },
 	{ "sin",	FSIN,		BLTIN },
 	{ "split",	SPLIT,		SPLIT },
 	{ "sprintf",	SPRINTF,	SPRINTF },
@@ -95,6 +100,7 @@
 	{ "tolower",	FTOLOWER,	BLTIN },
 	{ "toupper",	FTOUPPER,	BLTIN },
 	{ "while",	WHILE,		WHILE },
+	{ "xor",	BITXOR,		BITXOR }
 };
 
 #define	RET(eawk, x)							\
Index: othersrc/external/historical/eawk/dist/proctab.c
diff -u othersrc/external/historical/eawk/dist/proctab.c:1.1.1.1 othersrc/external/historical/eawk/dist/proctab.c:1.2
--- othersrc/external/historical/eawk/dist/proctab.c:1.1.1.1	Wed Aug 31 04:19:40 2011
+++ othersrc/external/historical/eawk/dist/proctab.c	Thu Sep  1 05:07:12 2011
@@ -4,7 +4,7 @@
 #include "awkgram.h"
 #include "proto.h"
 
-static const char * const printname[101] = {
+static const char * const printname[107] = {
 	"FIRSTTOKEN",	/* 258 */
 	"PROGRAM",	/* 259 */
 	"PASTAT",	/* 260 */
@@ -105,11 +105,17 @@
 	"DECR",		/* 355 */
 	"INCR",		/* 356 */
 	"INDIRECT",	/* 357 */
-	"LASTTOKEN",	/* 358 */
+	"BITCOMPL",	/* 358 */
+	"BITLSHIFT",	/* 359 */
+	"BITRSHIFT",	/* 360 */
+	"BITAND",	/* 361 */
+	"BITOR",	/* 362 */
+	"BITXOR",	/* 363 */
+	"LASTTOKEN",	/* 364 */
 };
 
 
-awkcell_t *(*eawk_proctab[101])(eawk_t *, awknode_t **, int) = {
+awkcell_t *(*eawk_proctab[107])(eawk_t *, awknode_t **, int) = {
 	eawk_nullproc,	/* FIRSTTOKEN */
 	eawk_program,	/* PROGRAM */
 	eawk_pastat,	/* PASTAT */
@@ -210,6 +216,12 @@
 	eawk_nullproc,	/* DECR */
 	eawk_nullproc,	/* INCR */
 	eawk_indirect,	/* INDIRECT */
+	eawk_bitarith,	/* BITCOMPL */
+	eawk_bitarith,	/* BITLSHIFT */
+	eawk_bitarith,	/* BITRSHIFT */
+	eawk_bitarith,	/* BITAND */
+	eawk_bitarith,	/* BITOR */
+	eawk_bitarith,	/* BITXOR */
 	eawk_nullproc,	/* LASTTOKEN */
 };
 
Index: othersrc/external/historical/eawk/dist/proto.h
diff -u othersrc/external/historical/eawk/dist/proto.h:1.1.1.1 othersrc/external/historical/eawk/dist/proto.h:1.2
--- othersrc/external/historical/eawk/dist/proto.h:1.1.1.1	Wed Aug 31 04:19:40 2011
+++ othersrc/external/historical/eawk/dist/proto.h	Thu Sep  1 05:07:12 2011
@@ -92,7 +92,7 @@
 #define	REC	0200	/* this is $0 */
 
 
-/* function types */
+/* BLTIN function types */
 #define	FLENGTH	1
 #define	FSQRT	2
 #define	FEXP	3
@@ -210,6 +210,7 @@
 awkcell_t	*eawk_sprintf(eawk_t *, awknode_t **, int);
 awkcell_t	*eawk_printf(eawk_t *, awknode_t **, int);
 awkcell_t	*eawk_arith(eawk_t *, awknode_t **, int);
+awkcell_t	*eawk_bitarith(eawk_t *, awknode_t **, int);
 awknum_t	eawk_ipow(awknum_t, int);
 awkcell_t	*eawk_incrdecr(eawk_t *, awknode_t **, int);
 awkcell_t	*eawk_assign(eawk_t *, awknode_t **, int);

Index: othersrc/external/historical/eawk/dist/run.c
diff -u othersrc/external/historical/eawk/dist/run.c:1.2 othersrc/external/historical/eawk/dist/run.c:1.3
--- othersrc/external/historical/eawk/dist/run.c:1.2	Thu Sep  1 05:03:18 2011
+++ othersrc/external/historical/eawk/dist/run.c	Thu Sep  1 05:07:12 2011
@@ -1084,7 +1084,7 @@
 				eawk_warning(eawk, "format item %.30s... ran format() out of memory", os);
 				return 0;
 			}
-			if (*s == 'l' || *s == 'h' || *s == 'L')
+			if (*s == 'l' || *s == 'h' || *s == 'L' || *s == 'q')
 				goto weird;
 			if (isalpha((uint8_t)*s))
 				break;	/* the ansi panoply */
@@ -1350,6 +1350,50 @@
 		return x * v * v;
 }
 
+/* bitwise operations */
+awkcell_t *
+eawk_bitarith(eawk_t *eawk, awknode_t **a, int op)
+{
+	awkcell_t	*x, *y, *res;
+	uint32_t	 i;
+	uint32_t	 j = 0;
+
+	x = eawk_execute(eawk, a[0]);
+	i = (uint32_t)eawk_getfval(eawk, x);
+	TEMPFREE(eawk, x);
+	if (op != BITCOMPL) {
+		y = eawk_execute(eawk, a[1]);
+		j = (uint32_t)eawk_getfval(eawk, y);
+		TEMPFREE(eawk, y);
+	}
+	res = eawk_gettemp(eawk);
+	switch (op) {
+	case BITAND:
+		i &= j;
+		break;
+	case BITOR:
+		i |= j;
+		break;
+	case BITXOR:
+		i ^= j;
+		break;
+	case BITCOMPL:
+		i = ~i;
+		break;
+	case BITLSHIFT:
+		i <<= j;
+		break;
+	case BITRSHIFT:
+		i >>= j;
+		break;
+	default:
+		(void) fprintf(stderr, "bitarith: not reached\n");
+		break;
+	}
+	eawk_setfval(eawk, res, (awknum_t)i);
+	return res;
+}
+
 /* a[0]++, etc. */
 awkcell_t *
 eawk_incrdecr(eawk_t *eawk, awknode_t **a, int n)

Index: othersrc/external/historical/eawk/eawk/Makefile
diff -u othersrc/external/historical/eawk/eawk/Makefile:1.1.1.1 othersrc/external/historical/eawk/eawk/Makefile:1.2
--- othersrc/external/historical/eawk/eawk/Makefile:1.1.1.1	Wed Aug 31 04:19:41 2011
+++ othersrc/external/historical/eawk/eawk/Makefile	Thu Sep  1 05:07:12 2011
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1.1.1 2011/08/31 04:19:41 agc Exp $
+# $NetBSD: Makefile,v 1.2 2011/09/01 05:07:12 agc Exp $
 
 .include <bsd.own.mk>
 
@@ -56,4 +56,6 @@
 	@echo "16. eawk and SHA256"
 	@(env LD_LIBRARY_PATH=${LIBEAWKDIR} ./${PROG} 'BEGIN { f = "../Makefile"; dlopen(libc, "libc"); buf = dlalloc(65); dlcall(libc, "cptr SHA256_File(awkptr, cptr)", f, buf); dlcall(libc, "int printf(awkptr, awkptr, cptr)", "SHA256 (%s) = %s\n", f, buf) }')
 	@digest sha256 ../Makefile
+	@echo "17. eawk using bit arithmetic"
+	@(cd ${.CURDIR}/../dist && env LD_LIBRARY_PATH=${LIBEAWKDIR} ./bit1.sh ${LIBEAWKDIR}/../eawk/${PROG})
 	@echo "All tests complete"
Index: othersrc/external/historical/eawk/eawk/expected
diff -u othersrc/external/historical/eawk/eawk/expected:1.1.1.1 othersrc/external/historical/eawk/eawk/expected:1.2
--- othersrc/external/historical/eawk/eawk/expected:1.1.1.1	Wed Aug 31 04:19:41 2011
+++ othersrc/external/historical/eawk/eawk/expected	Thu Sep  1 05:07:12 2011
@@ -1022,4 +1022,13 @@
 16. eawk and SHA256
 SHA256 (../Makefile) = a6ccb2e57801867720b434d8dfc248d62389c518457ea1a022861819151f2b1f
 SHA256 (../Makefile) = a6ccb2e57801867720b434d8dfc248d62389c518457ea1a022861819151f2b1f
+17. eawk using bit arithmetic
+x 0xff, compl ffffff00
+x 0xff, y 0x3fc
+x 0xff, y 0x3fc, z 0xff
+a 0x62, b 0x9d
+c & b = 10001 & 9d = 1
+c | b = 10001 | 9d = 1009d
+c & b = dfb & 9d = 99
+c | b = dfb | 9d = dff
 All tests complete

Reply via email to