aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-09-29 16:59:06 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2016-09-29 16:59:06 +0200
commit8286513838beaf9ccaab15bb5905248c3b7b8a69 (patch)
treeb7d72f0867668509260ea6b074c416702fb6fa2b
parent3b4d04b77eb5cfdb8ac6a799a3f3ccf1e455d0e7 (diff)
downloadbusybox-w32-8286513838beaf9ccaab15bb5905248c3b7b8a69.tar.gz
busybox-w32-8286513838beaf9ccaab15bb5905248c3b7b8a69.tar.bz2
busybox-w32-8286513838beaf9ccaab15bb5905248c3b7b8a69.zip
hush: rework input char buffering to allow more than one-deep peek
This fixes backslash+newline continuation in $VAR\ NAME construct. (ash has a bug there as well). function old new delta file_peek2 - 74 +74 parse_dollar 746 773 +27 expand_vars_to_list 1143 1167 +24 setup_string_in_str 32 46 +14 setup_file_in_str 33 47 +14 file_get 264 278 +14 static_peek2 - 7 +7 file_peek 91 72 -19 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 5/1 up/down: 174/-19) Total: 155 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash_test/ash-vars/var_serial.right5
-rwxr-xr-xshell/ash_test/ash-vars/var_serial.tests22
-rw-r--r--shell/ash_test/ash-vars/var_subst_in_for.right40
-rwxr-xr-xshell/ash_test/ash-vars/var_subst_in_for.tests40
-rw-r--r--shell/ash_test/ash-vars/var_unbackslash.right11
-rwxr-xr-xshell/ash_test/ash-vars/var_unbackslash.tests23
-rw-r--r--shell/ash_test/ash-vars/var_unbackslash1.right3
-rwxr-xr-xshell/ash_test/ash-vars/var_unbackslash1.tests15
-rw-r--r--shell/hush_test/hush-vars/var_unbackslash1.right3
-rwxr-xr-xshell/hush_test/hush-vars/var_unbackslash1.tests15
10 files changed, 177 insertions, 0 deletions
diff --git a/shell/ash_test/ash-vars/var_serial.right b/shell/ash_test/ash-vars/var_serial.right
new file mode 100644
index 000000000..42aa33057
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_serial.right
@@ -0,0 +1,5 @@
1Assignments only: c=a
2Assignments and a command: c=a
3Assignments and a builtin: c=a
4Assignments and a function: c=a
5Done
diff --git a/shell/ash_test/ash-vars/var_serial.tests b/shell/ash_test/ash-vars/var_serial.tests
new file mode 100755
index 000000000..6b4a4cdf7
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_serial.tests
@@ -0,0 +1,22 @@
1a=a
2
3b=b
4c=c
5# Second assignment depends on the first:
6b=$a c=$b
7echo Assignments only: c=$c
8
9b=b
10c=c
11b=$a c=$b "$THIS_SH" -c 'echo Assignments and a command: c=$c'
12
13b=b
14c=c
15b=$a c=$b eval 'echo Assignments and a builtin: c=$c'
16
17b=b
18c=c
19f() { echo Assignments and a function: c=$c; }
20b=$a c=$b f
21
22echo Done
diff --git a/shell/ash_test/ash-vars/var_subst_in_for.right b/shell/ash_test/ash-vars/var_subst_in_for.right
new file mode 100644
index 000000000..c8aca1c12
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_subst_in_for.right
@@ -0,0 +1,40 @@
1Testing: in x y z
2.x.
3.y.
4.z.
5Testing: in u $empty v
6.u.
7.v.
8Testing: in u " $empty" v
9.u.
10. .
11.v.
12Testing: in u $empty $empty$a v
13.u.
14.a.
15.v.
16Testing: in $a_b
17.a.
18.b.
19Testing: in $*
20.abc.
21.d.
22.e.
23Testing: in $@
24.abc.
25.d.
26.e.
27Testing: in -$*-
28.-abc.
29.d.
30.e-.
31Testing: in -$@-
32.-abc.
33.d.
34.e-.
35Testing: in $a_b -$a_b-
36.a.
37.b.
38.-a.
39.b-.
40Finished
diff --git a/shell/ash_test/ash-vars/var_subst_in_for.tests b/shell/ash_test/ash-vars/var_subst_in_for.tests
new file mode 100755
index 000000000..433c60627
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_subst_in_for.tests
@@ -0,0 +1,40 @@
1if test $# = 0; then
2 exec "$THIS_SH" "$0" abc "d e"
3fi
4
5echo 'Testing: in x y z'
6for a in x y z; do echo ".$a."; done
7
8echo 'Testing: in u $empty v'
9empty=''
10for a in u $empty v; do echo ".$a."; done
11
12echo 'Testing: in u " $empty" v'
13empty=''
14for a in u " $empty" v; do echo ".$a."; done
15
16echo 'Testing: in u $empty $empty$a v'
17a='a'
18for a in u $empty $empty$a v; do echo ".$a."; done
19
20echo 'Testing: in $a_b'
21a_b='a b'
22for a in $a_b; do echo ".$a."; done
23
24echo 'Testing: in $*'
25for a in $*; do echo ".$a."; done
26
27echo 'Testing: in $@'
28for a in $@; do echo ".$a."; done
29
30echo 'Testing: in -$*-'
31for a in -$*-; do echo ".$a."; done
32
33echo 'Testing: in -$@-'
34for a in -$@-; do echo ".$a."; done
35
36echo 'Testing: in $a_b -$a_b-'
37a_b='a b'
38for a in $a_b -$a_b-; do echo ".$a."; done
39
40echo Finished
diff --git a/shell/ash_test/ash-vars/var_unbackslash.right b/shell/ash_test/ash-vars/var_unbackslash.right
new file mode 100644
index 000000000..8bc834711
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_unbackslash.right
@@ -0,0 +1,11 @@
1b1=-qwerty-t-\-"-`---z-*-?-
2b1=-qwerty-t-\-"-`---z-*-?-
3b2=-qwerty-\t-\-"-`-\--\z-\*-\?-
4b2=-qwerty-\t-\-"-`-\--\z-\*-\?-
5b3=-$a-\t-\\-\"-\`-\--\z-\*-\?-
6b3=-$a-\t-\\-\"-\`-\--\z-\*-\?-
7c=-$a-\t-\\-\"-\`-\--\z-\*-\?-
8c=-$a-\t-\\-\"-\`-\--\z-\*-\?-
9c=-$a-\t-\\-\"-\`-\--\z-\*-\?-
10c=-$a-\t-\\-\"-\`-\--\z-\*-\?-
11Done: 0
diff --git a/shell/ash_test/ash-vars/var_unbackslash.tests b/shell/ash_test/ash-vars/var_unbackslash.tests
new file mode 100755
index 000000000..bb52af3d0
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_unbackslash.tests
@@ -0,0 +1,23 @@
1# Test for correct handling of backslashes
2a=qwerty
3
4b=-$a-\t-\\-\"-\`-\--\z-\*-\?-
5echo b1=$b
6echo "b1=$b"
7b="-$a-\t-\\-\"-\`-\--\z-\*-\?-"
8echo b2=$b
9echo "b2=$b"
10b='-$a-\t-\\-\"-\`-\--\z-\*-\?-'
11echo b3=$b
12echo "b3=$b"
13
14c=$b
15echo "c=$c"
16c=${b}
17echo "c=$c"
18c="$b"
19echo "c=$c"
20c="${b}"
21echo "c=$c"
22
23echo "Done: $?"
diff --git a/shell/ash_test/ash-vars/var_unbackslash1.right b/shell/ash_test/ash-vars/var_unbackslash1.right
new file mode 100644
index 000000000..8d4eca34e
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_unbackslash1.right
@@ -0,0 +1,3 @@
1Ok
2Ba d
3Ok
diff --git a/shell/ash_test/ash-vars/var_unbackslash1.tests b/shell/ash_test/ash-vars/var_unbackslash1.tests
new file mode 100755
index 000000000..8a9f2e249
--- /dev/null
+++ b/shell/ash_test/ash-vars/var_unbackslash1.tests
@@ -0,0 +1,15 @@
1ad="Ok"
2a="Ba"
3
4# "Ok"
5echo $a\
6d
7
8# This variable contains backslash+newline!
9e='echo $a\
10d'
11
12# "Ba d"
13eval $e
14# "Ok"
15eval "$e"
diff --git a/shell/hush_test/hush-vars/var_unbackslash1.right b/shell/hush_test/hush-vars/var_unbackslash1.right
new file mode 100644
index 000000000..8d4eca34e
--- /dev/null
+++ b/shell/hush_test/hush-vars/var_unbackslash1.right
@@ -0,0 +1,3 @@
1Ok
2Ba d
3Ok
diff --git a/shell/hush_test/hush-vars/var_unbackslash1.tests b/shell/hush_test/hush-vars/var_unbackslash1.tests
new file mode 100755
index 000000000..8a9f2e249
--- /dev/null
+++ b/shell/hush_test/hush-vars/var_unbackslash1.tests
@@ -0,0 +1,15 @@
1ad="Ok"
2a="Ba"
3
4# "Ok"
5echo $a\
6d
7
8# This variable contains backslash+newline!
9e='echo $a\
10d'
11
12# "Ba d"
13eval $e
14# "Ok"
15eval "$e"