svn commit: trunk/busybox/coreutils

aldot at busybox.net aldot at busybox.net
Mon Apr 2 16:38:13 UTC 2007


Author: aldot
Date: 2007-04-02 09:38:13 -0700 (Mon, 02 Apr 2007)
New Revision: 18304

Log:
- remove args from bss, minor misc shrinkage while at it.
   text    data     bss     dec     hex filename
   2577       0       4    2581     a15 expr.o
   2522       0       0    2522     9da expr.o


Modified:
   trunk/busybox/coreutils/expr.c


Changeset:
Modified: trunk/busybox/coreutils/expr.c
===================================================================
--- trunk/busybox/coreutils/expr.c	2007-04-02 16:18:48 UTC (rev 18303)
+++ trunk/busybox/coreutils/expr.c	2007-04-02 16:38:13 UTC (rev 18304)
@@ -62,15 +62,18 @@
 typedef struct valinfo VALUE;
 
 /* The arguments given to the program, minus the program name.  */
-static char **args;
+struct globals {
+	char **args;
+};
+#define G (*(struct globals*)&bb_common_bufsiz1)
 
 static VALUE *docolon(VALUE * sv, VALUE * pv);
 static VALUE *eval(void);
 static VALUE *int_value(arith_t i);
 static VALUE *str_value(const char *s);
-static int nextarg(const char *str);
+static bool nextarg(const char *str);
 static int null(VALUE * v);
-static int toarith(VALUE * v);
+static bool toarith(VALUE * v);
 static void freev(VALUE * v);
 static void tostring(VALUE * v);
 
@@ -83,10 +86,10 @@
 		bb_error_msg_and_die("too few arguments");
 	}
 
-	args = argv + 1;
+	G.args = argv + 1;
 
 	v = eval();
-	if (*args)
+	if (*G.args)
 		bb_error_msg_and_die("syntax error");
 
 	if (v->type == integer)
@@ -152,7 +155,7 @@
 
 /* Coerce V to an integer value.  Return 1 on success, 0 on failure.  */
 
-static int toarith(VALUE * v)
+static bool toarith(VALUE * v)
 {
 	if (v->type == string) {
 		arith_t i;
@@ -173,11 +176,11 @@
 /* Return nonzero if the next token matches STR exactly.
    STR must not be NULL.  */
 
-static int nextarg(const char *str)
+static bool nextarg(const char *str)
 {
-	if (*args == NULL)
+	if (*G.args == NULL)
 		return 0;
-	return strcmp(*args, str) == 0;
+	return strcmp(*G.args, str) == 0;
 }
 
 /* The comparison operator handling functions.  */
@@ -281,53 +284,57 @@
 {
 	VALUE *v;
 
-	if (!*args)
+	if (!*G.args)
 		bb_error_msg_and_die("syntax error");
 
 	if (nextarg("(")) {
-		args++;
+		G.args++;
 		v = eval();
 		if (!nextarg(")"))
 			bb_error_msg_and_die("syntax error");
-		args++;
+		G.args++;
 		return v;
 	}
 
 	if (nextarg(")"))
 		bb_error_msg_and_die("syntax error");
 
-	return str_value(*args++);
+	return str_value(*G.args++);
 }
 
 /* Handle match, substr, index, length, and quote keywords.  */
 
 static VALUE *eval6(void)
 {
-	VALUE *l, *r, *v, *i1, *i2;
+	VALUE *l, *r, *v = NULL /* silence gcc */, *i1, *i2;
+	const char * const keywords[] = {
+		"quote", "length", "match", "index", "substr", NULL
+	};
 
-	if (nextarg("quote")) {
-		args++;
-		if (!*args)
+	smalluint key = *G.args ? index_in_str_array(keywords, *G.args) + 1 : 0;
+	if (key == 0) /* not a keyword */
+		return eval7();
+	G.args++; /* We have a valid token, so get the next argument.  */
+	if (key == 1) { /* quote */
+		if (!*G.args)
 			bb_error_msg_and_die("syntax error");
-		return str_value(*args++);
-	} else if (nextarg("length")) {
-		args++;
+		return str_value(*G.args++);
+	}
+	if (key == 2) { /* length */
 		r = eval6();
 		tostring(r);
 		v = int_value(strlen(r->u.s));
 		freev(r);
-		return v;
-	} else if (nextarg("match")) {
-		args++;
+	} else
 		l = eval6();
+
+	if (key == 3) { /* match */
 		r = eval6();
 		v = docolon(l, r);
 		freev(l);
 		freev(r);
-		return v;
-	} else if (nextarg("index")) {
-		args++;
-		l = eval6();
+	}
+	if (key == 4) { /* index */
 		r = eval6();
 		tostring(l);
 		tostring(r);
@@ -336,10 +343,8 @@
 			v->u.i = 0;
 		freev(l);
 		freev(r);
-		return v;
-	} else if (nextarg("substr")) {
-		args++;
-		l = eval6();
+	}
+	if (key == 5) { /* substr */
 		i1 = eval6();
 		i2 = eval6();
 		tostring(l);
@@ -355,9 +360,9 @@
 		freev(l);
 		freev(i1);
 		freev(i2);
-		return v;
-	} else
-		return eval7();
+	}
+	return v;
+
 }
 
 /* Handle : operator (pattern matching).
@@ -369,7 +374,7 @@
 
 	l = eval6();
 	while (nextarg(":")) {
-		args++;
+		G.args++;
 		r = eval6();
 		v = docolon(l, r);
 		freev(l);
@@ -397,7 +402,7 @@
 			op = '%';
 		else
 			return l;
-		args++;
+		G.args++;
 		r = eval5();
 		val = arithmetic_common(l, r, op);
 		freev(l);
@@ -422,7 +427,7 @@
 			op = '-';
 		else
 			return l;
-		args++;
+		G.args++;
 		r = eval4();
 		val = arithmetic_common(l, r, op);
 		freev(l);
@@ -455,7 +460,7 @@
 			op = '>';
 		else
 			return l;
-		args++;
+		G.args++;
 		r = eval3();
 		toarith(l);
 		toarith(r);
@@ -474,7 +479,7 @@
 
 	l = eval2();
 	while (nextarg("&")) {
-		args++;
+		G.args++;
 		r = eval2();
 		if (null(l) || null(r)) {
 			freev(l);
@@ -494,7 +499,7 @@
 
 	l = eval1();
 	while (nextarg("|")) {
-		args++;
+		G.args++;
 		r = eval1();
 		if (null(l)) {
 			freev(l);




More information about the busybox-cvs mailing list