summary refs log tree commit diff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-10-11 22:38:46 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2007-10-11 22:38:46 +0800
commit556e233ad80f4c8230e512662be235d2cfb2c95b (patch)
tree6d68476bda34e2c945618fc747a68d4d30b32269
parent[ARITH] Add assignment and intmax_t support (diff)
downloaddash-556e233ad80f4c8230e512662be235d2cfb2c95b.tar.gz
dash-556e233ad80f4c8230e512662be235d2cfb2c95b.zip
[ARITH] Size optimisations in arithmetic lexer
Use += instead of straight assignment for token value.
Diffstat (limited to '')
-rw-r--r--ChangeLog1
-rw-r--r--src/arith_yylex.c52
2 files changed, 27 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 895c607..1f26b83 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2007-10-11  Herbert Xu <herbert@gondor.apana.org.au>
 
 	* Add assignment support in arithmetic expansions.
+	* Size optimisations in arithmetic lexer.
 
 2007-10-08  Herbert Xu <herbert@gondor.apana.org.au>
 
diff --git a/src/arith_yylex.c b/src/arith_yylex.c
index 0f46990..2c15657 100644
--- a/src/arith_yylex.c
+++ b/src/arith_yylex.c
@@ -56,7 +56,8 @@ yylex()
 	const char *p;
 
 	for (;;) {
-		switch (*buf) {
+		value = *buf;
+		switch (value) {
 		case ' ':
 		case '\t':
 		case '\n':
@@ -137,7 +138,7 @@ yylex()
 			value = ARITH_VAR;
 			goto out;
 		case '=':
-			value = ARITH_ASS;
+			value += ARITH_ASS - '=';
 checkeq:
 			if (*++buf != '=')
 				goto out;
@@ -146,85 +147,84 @@ checkeq:
 		case '>':
 			switch (*++buf) {
 			case '=':
-				value = ARITH_GE;
+				value += ARITH_GE - '>';
 				break;
 			case '>':
-				value = ARITH_RSHIFT;
+				value += ARITH_RSHIFT - '>';
 				goto checkeq;
 			default:
-				value = ARITH_GT;
+				value += ARITH_GT - '>';
 				goto out;
 			}
 			break;
 		case '<':
 			switch (*++buf) {
 			case '=':
-				value = ARITH_LE;
+				value += ARITH_LE - '<';
 				break;
 			case '<':
-				value = ARITH_LSHIFT;
+				value += ARITH_LSHIFT - '<';
 				goto checkeq;
 			default:
-				value = ARITH_LT;
+				value += ARITH_LT - '<';
 				goto out;
 			}
 			break;
 		case '|':
 			if (*++buf != '|') {
-				value = ARITH_BOR;
+				value += ARITH_BOR - '|';
 				goto checkeq;
 			}
-			value = ARITH_OR;
+			value += ARITH_OR - '|';
 			break;
 		case '&':
 			if (*++buf != '&') {
-				value = ARITH_BAND;
+				value += ARITH_BAND - '&';
 				goto checkeq;
 			}
-			value = ARITH_AND;
+			value += ARITH_AND - '&';
 			break;
 		case '!':
 			if (*++buf != '=') {
-				value = ARITH_NOT;
+				value += ARITH_NOT - '!';
 				goto out;
 			}
-			value = ARITH_NE;
+			value += ARITH_NE - '!';
 			break;
 		case 0:
-			value = 0;
 			goto out;
 		case '(':
-			value = ARITH_LPAREN;
+			value += ARITH_LPAREN - '(';
 			break;
 		case ')':
-			value = ARITH_RPAREN;
+			value += ARITH_RPAREN - ')';
 			break;
 		case '*':
-			value = ARITH_MUL;
+			value += ARITH_MUL - '*';
 			goto checkeq;
 		case '/':
-			value = ARITH_DIV;
+			value += ARITH_DIV - '/';
 			goto checkeq;
 		case '%':
-			value = ARITH_REM;
+			value += ARITH_REM - '%';
 			goto checkeq;
 		case '+':
-			value = ARITH_ADD;
+			value += ARITH_ADD - '+';
 			goto checkeq;
 		case '-':
-			value = ARITH_SUB;
+			value += ARITH_SUB - '-';
 			goto checkeq;
 		case '~':
-			value = ARITH_BNOT;
+			value += ARITH_BNOT - '~';
 			break;
 		case '^':
-			value = ARITH_BXOR;
+			value += ARITH_BXOR - '^';
 			goto checkeq;
 		case '?':
-			value = ARITH_QMARK;
+			value += ARITH_QMARK - '?';
 			break;
 		case ':':
-			value = ARITH_COLON;
+			value += ARITH_COLON - ':';
 			break;
 		}
 		break;