aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-05-13 15:20:24 +0300
committerSergey Poznyakoff <gray@gnu.org>2019-05-13 15:20:24 +0300
commit65f41a742e025487f8ec7f2e7ca2a3af3283fc96 (patch)
treecef728d35f7683f7721659a58fdb2aa1f61387bc
parent07930c5ee74b8d2645fc55465833ab84e2f4444a (diff)
downloadgrecs-65f41a742e025487f8ec7f2e7ca2a3af3283fc96.tar.gz
grecs-65f41a742e025487f8ec7f2e7ca2a3af3283fc96.tar.bz2
wordsplit: optionally disable splitting of unexpandable variable and command refs
* include/wordsplit.h (WRDSO_NOVARSPLIT) (WRDSO_NOCMDSPLIT): New options. * src/wordsplit.c (scan_word): Treat any variable reference, even containing whitespace, as a single word if WRDSO_NOVARSPLIT is set. Ditto for commands and WRDSO_NOCMDSPLIT. * tests/wordsplit.at: Add new tests. * tests/wsp.c: Recognize novarsplit and nocmdsplit options. For future use: recognize bskeep_words, bskeep_quote, bskeep.
-rw-r--r--include/wordsplit.h11
-rw-r--r--src/wordsplit.c6
-rw-r--r--tests/wordsplit.at18
-rw-r--r--tests/wsp.c11
4 files changed, 38 insertions, 8 deletions
diff --git a/include/wordsplit.h b/include/wordsplit.h
index 3a7ab25..a175275 100644
--- a/include/wordsplit.h
+++ b/include/wordsplit.h
@@ -203,5 +203,3 @@ struct wordsplit
203#define WRDSO_DOTGLOB 0x00000004 203#define WRDSO_DOTGLOB 0x00000004
204#if 0 /* Unused value */ 204/* Unused value: 0x00000008 */
205#define WRDSO_ARGV 0x00000008
206#endif
207/* Keep backslash in unrecognized escape sequences in words */ 205/* Keep backslash in unrecognized escape sequences in words */
@@ -222,2 +220,9 @@ struct wordsplit
222#define WRDSO_XESC_QUOTE 0x00000400 220#define WRDSO_XESC_QUOTE 0x00000400
221/* Unused: 0x00000800 */
222/* Don't split variable references, even if they contain whitespace
223 (e.g. ${VAR:-foo bar}) */
224#define WRDSO_NOVARSPLIT 0x00001000
225/* Don't split commands, even containing whitespace, e.g.
226 $(echo foo bar) */
227#define WRDSO_NOCMDSPLIT 0x00002000
223 228
diff --git a/src/wordsplit.c b/src/wordsplit.c
index e979f27..521a1eb 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -2060,3 +2060,4 @@ scan_word (struct wordsplit *wsp, size_t start, int consume_all)
2060 { 2060 {
2061 if (!(wsp->ws_flags & WRDSF_NOVAR) 2061 if ((!(wsp->ws_flags & WRDSF_NOVAR)
2062 || (wsp->ws_options & WRDSO_NOVARSPLIT))
2062 && command[i+1] == '{' 2063 && command[i+1] == '{'
@@ -2064,3 +2065,4 @@ scan_word (struct wordsplit *wsp, size_t start, int consume_all)
2064 continue; 2065 continue;
2065 if (!(wsp->ws_flags & WRDSF_NOCMD) 2066 if ((!(wsp->ws_flags & WRDSF_NOCMD)
2067 || (wsp->ws_options & WRDSO_NOCMDSPLIT))
2066 && command[i+1] == '(' 2068 && command[i+1] == '('
diff --git a/tests/wordsplit.at b/tests/wordsplit.at
index e3af703..1f2e80d 100644
--- a/tests/wordsplit.at
+++ b/tests/wordsplit.at
@@ -952,2 +952,20 @@ TOTAL: 3
952 952
953TESTWSP([variable nosplit],[],[novar novarsplit],
954[begin ${VAR:- a b} end],
955[NF: 3
9560: begin
9571: "${VAR:- a b}"
9582: end
959TOTAL: 3
960])
961
962TESTWSP([command nosplit],[],[nocmd nocmdsplit],
963[begin $(words a b) end],
964[NF: 3
9650: begin
9661: "$(words a b)"
9672: end
968TOTAL: 3
969])
970
953m4_popdef([TESTWSP]) 971m4_popdef([TESTWSP])
diff --git a/tests/wsp.c b/tests/wsp.c
index cca3a36..bd13e63 100644
--- a/tests/wsp.c
+++ b/tests/wsp.c
@@ -63,5 +63,10 @@ struct kwd bool_keytab[] = {
63struct kwd opt_keytab[] = { 63struct kwd opt_keytab[] = {
64 { "nullglob", WRDSO_NULLGLOB }, 64 { "nullglob", WRDSO_NULLGLOB },
65 { "failglob", WRDSO_FAILGLOB }, 65 { "failglob", WRDSO_FAILGLOB },
66 { "dotglob", WRDSO_DOTGLOB }, 66 { "dotglob", WRDSO_DOTGLOB },
67 { "bskeep_words", WRDSO_BSKEEP_WORD },
68 { "bskeep_quote", WRDSO_BSKEEP_QUOTE },
69 { "bskeep", WRDSO_BSKEEP_WORD|WRDSO_BSKEEP_QUOTE },
70 { "novarsplit", WRDSO_NOVARSPLIT },
71 { "nocmdsplit", WRDSO_NOCMDSPLIT },
67 { NULL, 0 } 72 { NULL, 0 }

Return to:

Send suggestions and report system problems to the System administrator.