summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-10-04 22:20:38 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2007-10-04 22:20:38 +0800
commitd4948c45d3e5f54823fac68f0c11f1dd09e75083 (patch)
treef83cbb5f1fc032dde5fd89e9780a79e69683e2b9 /src
parent[PARSER] Fix parsing of ${##1} (diff)
downloaddash-d4948c45d3e5f54823fac68f0c11f1dd09e75083.tar.gz
dash-d4948c45d3e5f54823fac68f0c11f1dd09e75083.zip
[PARSER] Size optimisations in parameter expansion parser
Merge flags into subtype.
Do not write subtype out twice.
Add likely flag on ${ vs. $NAME.
Kill unnecessary (and bogus) PEOA check.
Diffstat (limited to 'src')
-rw-r--r--src/parser.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/parser.c b/src/parser.c
index 9edb824..f49ee7d 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1142,7 +1142,6 @@ parseredir: {
 parsesub: {
 	int subtype;
 	int typeloc;
-	int flags;
 	char *p;
 	static const char types[] = "}-+?=";
 
@@ -1163,18 +1162,18 @@ parsesub: {
 	} else {
 		USTPUTC(CTLVAR, out);
 		typeloc = out - (char *)stackblock();
-		USTPUTC(VSNORMAL, out);
+		STADJUST(1, out);
 		subtype = VSNORMAL;
-		if (c == '{') {
+		if (likely(c == '{')) {
 			c = pgetc();
 			subtype = 0;
 		}
 varname:
-		if (c > PEOA && is_name(c)) {
+		if (is_name(c)) {
 			do {
 				STPUTC(c, out);
 				c = pgetc();
-			} while (c > PEOA && is_in_name(c));
+			} while (is_in_name(c));
 		} else if (is_digit(c)) {
 			do {
 				STPUTC(c, out);
@@ -1208,18 +1207,17 @@ varname:
 badsub:			synerror("Bad substitution");
 
 		STPUTC('=', out);
-		flags = 0;
 		if (subtype == 0) {
 			switch (c) {
 			case ':':
-				flags = VSNUL;
+				subtype = VSNUL;
 				c = pgetc();
 				/*FALLTHROUGH*/
 			default:
 				p = strchr(types, c);
 				if (p == NULL)
 					goto badsub;
-				subtype = p - types + VSNORMAL;
+				subtype |= p - types + VSNORMAL;
 				break;
 			case '%':
 			case '#':
@@ -1238,7 +1236,7 @@ badsub:			synerror("Bad substitution");
 		} else {
 			pungetc();
 		}
-		*((char *)stackblock() + typeloc) = subtype | flags;
+		*((char *)stackblock() + typeloc) = subtype;
 		if (subtype != VSNORMAL) {
 			varnest++;
 			if (dblquote)