shave off 12 bytes (with fixed gcc) by making the definitions more legible
(and dropping struct padding, tbh)
This commit is contained in:
		
							
								
								
									
										131
									
								
								expr.c
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								expr.c
									
									
									
									
									
								
							| @@ -23,44 +23,10 @@ | ||||
|  | ||||
| #include "sh.h" | ||||
|  | ||||
| __RCSID("$MirOS: src/bin/mksh/expr.c,v 1.87 2016/07/25 20:41:23 tg Exp $"); | ||||
| __RCSID("$MirOS: src/bin/mksh/expr.c,v 1.88 2016/07/27 00:55:27 tg Exp $"); | ||||
|  | ||||
| /* the order of these enums is constrained by the order of opinfo[] */ | ||||
| enum token { | ||||
| 	/* some (long) unary operators */ | ||||
| 	O_PLUSPLUS = 0, O_MINUSMINUS, | ||||
| 	/* binary operators */ | ||||
| 	O_EQ, O_NE, | ||||
| 	/* assignments are assumed to be in range O_ASN .. O_BORASN */ | ||||
| 	O_ASN, O_TIMESASN, O_DIVASN, O_MODASN, O_PLUSASN, O_MINUSASN, | ||||
| #ifndef MKSH_LEGACY_MODE | ||||
| 	O_ROLASN, O_RORASN, | ||||
| #endif | ||||
| 	O_LSHIFTASN, O_RSHIFTASN, O_BANDASN, O_BXORASN, O_BORASN, | ||||
| 	/* binary non-assignment operators */ | ||||
| #ifndef MKSH_LEGACY_MODE | ||||
| 	O_ROL, O_ROR, | ||||
| #endif | ||||
| 	O_LSHIFT, O_RSHIFT, | ||||
| 	O_LE, O_GE, O_LT, O_GT, | ||||
| 	O_LAND, | ||||
| 	O_LOR, | ||||
| 	O_TIMES, O_DIV, O_MOD, | ||||
| 	O_PLUS, O_MINUS, | ||||
| 	O_BAND, | ||||
| 	O_BXOR, | ||||
| 	O_BOR, | ||||
| 	O_TERN, | ||||
| 	O_COMMA, | ||||
| 	/* things after this aren't used as binary operators */ | ||||
| 	/* unary that are not also binaries */ | ||||
| 	O_BNOT, O_LNOT, | ||||
| 	/* misc */ | ||||
| 	OPEN_PAREN, CLOSE_PAREN, CTERN, | ||||
| 	/* things that don't appear in the opinfo[] table */ | ||||
| 	VAR, LIT, END, BAD | ||||
| }; | ||||
| #define IS_ASSIGNOP(op)	((int)(op) >= (int)O_ASN && (int)(op) <= (int)O_BORASN) | ||||
| #define EXPRTOK_DEFNS | ||||
| #include "exprtok.h" | ||||
|  | ||||
| /* precisions; used to be enum prec but we do arithmetics on it */ | ||||
| #define P_PRIMARY	0	/* VAR, LIT, (), ! ~ ++ -- */ | ||||
| @@ -80,67 +46,24 @@ enum token { | ||||
| #define P_COMMA		13	/* , */ | ||||
| #define MAX_PREC	P_COMMA | ||||
|  | ||||
| struct opinfo { | ||||
| 	char name[4]; | ||||
| 	/* name length */ | ||||
| 	uint8_t len; | ||||
| 	/* precedence: lower is higher */ | ||||
| 	uint8_t prec; | ||||
| enum token { | ||||
| #define EXPRTOK_ENUM | ||||
| #include "exprtok.h" | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Tokens in this table must be ordered so the longest are first | ||||
|  * (eg, += before +). If you change something, change the order | ||||
|  * of enum token too. | ||||
|  */ | ||||
| static const struct opinfo opinfo[] = { | ||||
| 	{ "++",   2, P_PRIMARY },	/* before + */ | ||||
| 	{ "--",   2, P_PRIMARY },	/* before - */ | ||||
| 	{ "==",   2, P_EQUALITY },	/* before = */ | ||||
| 	{ "!=",   2, P_EQUALITY },	/* before ! */ | ||||
| 	{ "=",    1, P_ASSIGN },	/* keep assigns in a block */ | ||||
| 	{ "*=",   2, P_ASSIGN }, | ||||
| 	{ "/=",   2, P_ASSIGN }, | ||||
| 	{ "%=",   2, P_ASSIGN }, | ||||
| 	{ "+=",   2, P_ASSIGN }, | ||||
| 	{ "-=",   2, P_ASSIGN }, | ||||
| #ifndef MKSH_LEGACY_MODE | ||||
| 	{ "^<=",  3, P_ASSIGN },	/* before ^< */ | ||||
| 	{ "^>=",  3, P_ASSIGN },	/* before ^> */ | ||||
| #endif | ||||
| 	{ "<<=",  3, P_ASSIGN }, | ||||
| 	{ ">>=",  3, P_ASSIGN }, | ||||
| 	{ "&=",   2, P_ASSIGN }, | ||||
| 	{ "^=",   2, P_ASSIGN }, | ||||
| 	{ "|=",   2, P_ASSIGN }, | ||||
| #ifndef MKSH_LEGACY_MODE | ||||
| 	{ "^<",   2, P_SHIFT },		/* before ^ */ | ||||
| 	{ "^>",   2, P_SHIFT },		/* before ^ */ | ||||
| #endif | ||||
| 	{ "<<",   2, P_SHIFT }, | ||||
| 	{ ">>",   2, P_SHIFT }, | ||||
| 	{ "<=",   2, P_RELATION }, | ||||
| 	{ ">=",   2, P_RELATION }, | ||||
| 	{ "<",    1, P_RELATION }, | ||||
| 	{ ">",    1, P_RELATION }, | ||||
| 	{ "&&",   2, P_LAND }, | ||||
| 	{ "||",   2, P_LOR }, | ||||
| 	{ "*",    1, P_MULT }, | ||||
| 	{ "/",    1, P_MULT }, | ||||
| 	{ "%",    1, P_MULT }, | ||||
| 	{ "+",    1, P_ADD }, | ||||
| 	{ "-",    1, P_ADD }, | ||||
| 	{ "&",    1, P_BAND }, | ||||
| 	{ "^",    1, P_BXOR }, | ||||
| 	{ "|",    1, P_BOR }, | ||||
| 	{ "?",    1, P_TERN }, | ||||
| 	{ ",",    1, P_COMMA }, | ||||
| 	{ "~",    1, P_PRIMARY }, | ||||
| 	{ "!",    1, P_PRIMARY }, | ||||
| 	{ "(",    1, P_PRIMARY }, | ||||
| 	{ ")",    1, P_PRIMARY }, | ||||
| 	{ ":",    1, P_PRIMARY }, | ||||
| 	{ "",     0, P_PRIMARY } | ||||
| static const char opname[][4] = { | ||||
| #define EXPRTOK_NAME | ||||
| #include "exprtok.h" | ||||
| }; | ||||
|  | ||||
| static const uint8_t oplen[] = { | ||||
| #define EXPRTOK_LEN | ||||
| #include "exprtok.h" | ||||
| }; | ||||
|  | ||||
| static const uint8_t opprec[] = { | ||||
| #define EXPRTOK_PREC | ||||
| #include "exprtok.h" | ||||
| }; | ||||
|  | ||||
| typedef struct expr_state { | ||||
| @@ -272,7 +195,7 @@ evalerr(Expr_state *es, enum error_type type, const char *str) | ||||
| 			s = tbuf; | ||||
| 			break; | ||||
| 		default: | ||||
| 			s = opinfo[(int)es->tok].name; | ||||
| 			s = opname[(int)es->tok]; | ||||
| 		} | ||||
| 		warningf(true, Tf_sD_s_qs, es->expression, | ||||
| 		    Tunexpected, s); | ||||
| @@ -402,7 +325,7 @@ evalexpr(Expr_state *es, unsigned int prec) | ||||
|  | ||||
| 	vl = evalexpr(es, prec - 1); | ||||
| 	while ((int)(op = es->tok) >= (int)O_EQ && (int)op <= (int)O_COMMA && | ||||
| 	    opinfo[(int)op].prec == prec) { | ||||
| 	    opprec[(int)op] == prec) { | ||||
| 		exprtoken(es); | ||||
| 		vasn = vl; | ||||
| 		if (op != O_ASN) | ||||
| @@ -698,11 +621,11 @@ exprtoken(Expr_state *es) | ||||
| 	} else { | ||||
| 		int i, n0; | ||||
|  | ||||
| 		for (i = 0; (n0 = opinfo[i].name[0]); i++) | ||||
| 			if (c == n0 && strncmp(cp, opinfo[i].name, | ||||
| 			    (size_t)opinfo[i].len) == 0) { | ||||
| 		for (i = 0; (n0 = opname[i][0]); i++) | ||||
| 			if (c == n0 && strncmp(cp, opname[i], | ||||
| 			    (size_t)oplen[i]) == 0) { | ||||
| 				es->tok = (enum token)i; | ||||
| 				cp += opinfo[i].len; | ||||
| 				cp += oplen[i]; | ||||
| 				break; | ||||
| 			} | ||||
| 		if (!n0) | ||||
| @@ -716,9 +639,9 @@ assign_check(Expr_state *es, enum token op, struct tbl *vasn) | ||||
| { | ||||
| 	if (es->tok == END || !vasn || | ||||
| 	    (vasn->name[0] == '\0' && !(vasn->flag & EXPRLVALUE))) | ||||
| 		evalerr(es, ET_LVALUE, opinfo[(int)op].name); | ||||
| 		evalerr(es, ET_LVALUE, opname[(int)op]); | ||||
| 	else if (vasn->flag & RDONLY) | ||||
| 		evalerr(es, ET_RDONLY, opinfo[(int)op].name); | ||||
| 		evalerr(es, ET_RDONLY, opname[(int)op]); | ||||
| } | ||||
|  | ||||
| struct tbl * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user