svn commit: trunk/busybox/shell: hush_test/hush-bugs hush_test/hush-pars etc...

vda at busybox.net vda at busybox.net
Wed May 16 03:39:26 PDT 2007


Author: vda
Date: 2007-05-16 03:39:24 -0700 (Wed, 16 May 2007)
New Revision: 18633

Log:
hush: fix expansion of quoted $VAR, $* and $@



Added:
   trunk/busybox/shell/hush_test/hush-parsing/quote4.right
   trunk/busybox/shell/hush_test/hush-parsing/quote4.tests
   trunk/busybox/shell/hush_test/hush-parsing/starquoted.right
   trunk/busybox/shell/hush_test/hush-parsing/starquoted.tests

Removed:
   trunk/busybox/shell/hush_test/hush-bugs/starquoted.right
   trunk/busybox/shell/hush_test/hush-bugs/starquoted.tests

Modified:
   trunk/busybox/shell/hush.c
   trunk/busybox/shell/hush_test/hush-bugs/quote3.right
   trunk/busybox/shell/hush_test/hush-bugs/quote3.tests


Changeset:
Modified: trunk/busybox/shell/hush.c
===================================================================
--- trunk/busybox/shell/hush.c	2007-05-16 09:36:55 UTC (rev 18632)
+++ trunk/busybox/shell/hush.c	2007-05-16 10:39:24 UTC (rev 18633)
@@ -2425,6 +2425,7 @@
 static int expand_vars_to_list(char **list, int n, char **posp, char *arg)
 {
 	char first_ch, ored_ch;
+	int i;
 	const char *val;
 	char *p;
 	char *pos = *posp;
@@ -2462,8 +2463,8 @@
 			break;
 		case '*':
 		case '@':
+			i = 1;
 			if (!(first_ch & 0x80)) { /* unquoted $* or $@ */
-				int i = 1;
 				while (i < global_argc) {
 					n = expand_on_ifs(list, n, &pos, global_argv[i]);
 					debug_printf_expand("expand_vars_to_list: argv %d (last %d)\n", i, global_argc-1);
@@ -2478,16 +2479,33 @@
 					}
 				}
 			} else if (first_ch == ('@'|0x80)) { /* quoted $@ */
-				/* TODO */
-			} else { /* quoted $* */
-				/* TODO */
+				while (1) {
+					strcpy(pos, global_argv[i]);
+					pos += strlen(global_argv[i]);
+					if (++i >= global_argc)
+						break;
+					*pos++ = '\0';
+					if (n) debug_printf_expand("expand_vars_to_list 3 finalized list[%d]=%p '%s' "
+						"strlen=%d next=%p pos=%p\n", n-1, list[n-1], list[n-1],
+							strlen(list[n-1]), list[n-1] + strlen(list[n-1]) + 1, pos);
+					list[n++] = pos;
+				}
+			} else { /* quoted $*: add as one word */
+				while (1) {
+					strcpy(pos, global_argv[i]);
+					pos += strlen(global_argv[i]);
+					if (++i >= global_argc)
+						break;
+					if (ifs[0])
+						*pos++ = ifs[0];
+				}
 			}
 			break;
 		default:
 			*p = '\0';
 			arg[0] = first_ch & 0x7f;
 			if (isdigit(arg[0])) {
-				int i = xatoi_u(arg);
+				i = xatoi_u(arg);
 				val = NULL;
 				if (i < global_argc)
 					val = global_argv[i];
@@ -2495,12 +2513,12 @@
 				val = lookup_param(arg);
 			arg[0] = first_ch;
 			*p = SPECIAL_VAR_SYMBOL;
-			if (!(first_ch & 0x80)) { /* unquoted var */
+			if (!(first_ch & 0x80)) { /* unquoted $VAR */
 				if (val) {
 					n = expand_on_ifs(list, n, &pos, val);
 					val = NULL;
 				}
-			}
+			} /* else: quoted $VAR, val will be appended at pos */
 		}
 		if (val) {
 			strcpy(pos, val);
@@ -3268,18 +3286,18 @@
 /* return code: 0 for OK, 1 for syntax error */
 static int handle_dollar(o_string *dest, struct p_context *ctx, struct in_str *input)
 {
-//	int i;
-//	char sep[] = " ";
 	int ch = b_peek(input);  /* first character after the $ */
+	unsigned char quote_mask = dest->quote ? 0x80 : 0;
 
 	debug_printf_parse("handle_dollar entered: ch='%c'\n", ch);
-	if (isalpha(ch) || ch == '?') {
+	if (isalpha(ch)) {
 		b_addchr(dest, SPECIAL_VAR_SYMBOL);
 		ctx->child->sp++;
 		while (1) {
 			debug_printf_parse(": '%c'\n", ch);
 			b_getch(input);
-			b_addchr(dest, ch);
+			b_addchr(dest, ch | quote_mask);
+			quote_mask = 0;
 			ch = b_peek(input);
 			if (!isalnum(ch) && ch != '_')
 				break;
@@ -3291,7 +3309,7 @@
 		ctx->child->sp++;
 		debug_printf_parse(": '%c'\n", ch);
 		b_getch(input);
-		b_addchr(dest, ch);
+		b_addchr(dest, ch | quote_mask);
 		b_addchr(dest, SPECIAL_VAR_SYMBOL);
 	} else switch (ch) {
 		case '$': /* pid */
@@ -3316,7 +3334,8 @@
 				if (ch == '}')
 					break;
 				debug_printf_parse(": '%c'\n", ch);
-				b_addchr(dest, ch);
+				b_addchr(dest, ch | quote_mask);
+				quote_mask = 0;
 			}
 			b_addchr(dest, SPECIAL_VAR_SYMBOL);
 			break;

Modified: trunk/busybox/shell/hush_test/hush-bugs/quote3.right
===================================================================
--- trunk/busybox/shell/hush_test/hush-bugs/quote3.right	2007-05-16 09:36:55 UTC (rev 18632)
+++ trunk/busybox/shell/hush_test/hush-bugs/quote3.right	2007-05-16 10:39:24 UTC (rev 18633)
@@ -1,8 +1,3 @@
 Testing: in $empty""
 ..
-Testing: in "$*"
-.abc d e.
-Testing: in "$@"
-.abc.
-.d e.
 Finished

Modified: trunk/busybox/shell/hush_test/hush-bugs/quote3.tests
===================================================================
--- trunk/busybox/shell/hush_test/hush-bugs/quote3.tests	2007-05-16 09:36:55 UTC (rev 18632)
+++ trunk/busybox/shell/hush_test/hush-bugs/quote3.tests	2007-05-16 10:39:24 UTC (rev 18633)
@@ -5,8 +5,4 @@
 echo 'Testing: in $empty""'
 empty=''
 for a in $empty""; do echo ".$a."; done
-echo 'Testing: in "$*"'
-for a in "$*"; do echo ".$a."; done
-echo 'Testing: in "$@"'
-for a in "$@"; do echo ".$a."; done
 echo Finished

Deleted: trunk/busybox/shell/hush_test/hush-bugs/starquoted.right
===================================================================
--- trunk/busybox/shell/hush_test/hush-bugs/starquoted.right	2007-05-16 09:36:55 UTC (rev 18632)
+++ trunk/busybox/shell/hush_test/hush-bugs/starquoted.right	2007-05-16 10:39:24 UTC (rev 18633)
@@ -1 +0,0 @@
-.1 abc d e f.

Deleted: trunk/busybox/shell/hush_test/hush-bugs/starquoted.tests
===================================================================
--- trunk/busybox/shell/hush_test/hush-bugs/starquoted.tests	2007-05-16 09:36:55 UTC (rev 18632)
+++ trunk/busybox/shell/hush_test/hush-bugs/starquoted.tests	2007-05-16 10:39:24 UTC (rev 18633)
@@ -1,4 +0,0 @@
-if test $# = 0; then
-    exec "$THIS_SH" starquoted.tests 1 abc 'd e f'
-fi
-for a in "$*"; do echo ".$a."; done

Added: trunk/busybox/shell/hush_test/hush-parsing/quote4.right
===================================================================
--- trunk/busybox/shell/hush_test/hush-parsing/quote4.right	                        (rev 0)
+++ trunk/busybox/shell/hush_test/hush-parsing/quote4.right	2007-05-16 10:39:24 UTC (rev 18633)
@@ -0,0 +1 @@
+a b

Added: trunk/busybox/shell/hush_test/hush-parsing/quote4.tests
===================================================================
--- trunk/busybox/shell/hush_test/hush-parsing/quote4.tests	                        (rev 0)
+++ trunk/busybox/shell/hush_test/hush-parsing/quote4.tests	2007-05-16 10:39:24 UTC (rev 18633)
@@ -0,0 +1,2 @@
+a_b='a b'
+echo "$a_b"


Property changes on: trunk/busybox/shell/hush_test/hush-parsing/quote4.tests
___________________________________________________________________
Name: svn:executable
   + *

Copied: trunk/busybox/shell/hush_test/hush-parsing/starquoted.right (from rev 18632, trunk/busybox/shell/hush_test/hush-bugs/starquoted.right)
===================================================================
--- trunk/busybox/shell/hush_test/hush-parsing/starquoted.right	                        (rev 0)
+++ trunk/busybox/shell/hush_test/hush-parsing/starquoted.right	2007-05-16 10:39:24 UTC (rev 18633)
@@ -0,0 +1,8 @@
+.1 abc d e f.
+.1.
+.abc.
+.d e f.
+.-1 abc d e f-.
+.-1.
+.abc.
+.d e f-.

Copied: trunk/busybox/shell/hush_test/hush-parsing/starquoted.tests (from rev 18632, trunk/busybox/shell/hush_test/hush-bugs/starquoted.tests)
===================================================================
--- trunk/busybox/shell/hush_test/hush-parsing/starquoted.tests	                        (rev 0)
+++ trunk/busybox/shell/hush_test/hush-parsing/starquoted.tests	2007-05-16 10:39:24 UTC (rev 18633)
@@ -0,0 +1,8 @@
+if test $# = 0; then
+    exec "$THIS_SH" "$0" 1 abc 'd e f'
+fi
+
+for a in "$*"; do echo ".$a."; done
+for a in "$@"; do echo ".$a."; done
+for a in "-$*-"; do echo ".$a."; done
+for a in "-$@-"; do echo ".$a."; done



More information about the busybox-cvs mailing list