diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-05-13 15:20:24 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-05-13 15:20:24 +0300 |
commit | 65f41a742e025487f8ec7f2e7ca2a3af3283fc96 (patch) | |
tree | cef728d35f7683f7721659a58fdb2aa1f61387bc | |
parent | 07930c5ee74b8d2645fc55465833ab84e2f4444a (diff) | |
download | grecs-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.h | 11 | ||||
-rw-r--r-- | src/wordsplit.c | 6 | ||||
-rw-r--r-- | tests/wordsplit.at | 18 | ||||
-rw-r--r-- | tests/wsp.c | 11 |
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 | ||
953 | TESTWSP([variable nosplit],[],[novar novarsplit], | ||
954 | [begin ${VAR:- a b} end], | ||
955 | [NF: 3 | ||
956 | 0: begin | ||
957 | 1: "${VAR:- a b}" | ||
958 | 2: end | ||
959 | TOTAL: 3 | ||
960 | ]) | ||
961 | |||
962 | TESTWSP([command nosplit],[],[nocmd nocmdsplit], | ||
963 | [begin $(words a b) end], | ||
964 | [NF: 3 | ||
965 | 0: begin | ||
966 | 1: "$(words a b)" | ||
967 | 2: end | ||
968 | TOTAL: 3 | ||
969 | ]) | ||
970 | |||
953 | m4_popdef([TESTWSP]) | 971 | m4_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[] = { | |||
63 | struct kwd opt_keytab[] = { | 63 | struct 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 } |