hush: preparatory patch, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2010-10-03 14:26:26 +02:00
parent 0296fd3af1
commit 238081f750

View File

@ -2000,26 +2000,9 @@ static void o_addstr_with_NUL(o_string *o, const char *str)
o_addblock(o, str, strlen(str) + 1); o_addblock(o, str, strlen(str) + 1);
} }
static void o_addblock_duplicate_backslash(o_string *o, const char *str, int len) #undef HUSH_BRACE_EXPANSION
{
while (len) {
len--;
o_addchr(o, *str);
if (*str++ == '\\') {
/* \z -> \\\z; \<eol> -> \\<eol> */
o_addchr(o, '\\');
if (len) {
len--;
o_addchr(o, '\\');
o_addchr(o, *str++);
}
}
}
}
#undef HUSH_BRACE_EXP
/* /*
* HUSH_BRACE_EXP code needs corresponding quoting on variable expansion side. * HUSH_BRACE_EXPANSION code needs corresponding quoting on variable expansion side.
* Currently, "v='{q,w}'; echo $v" erroneously expands braces in $v. * Currently, "v='{q,w}'; echo $v" erroneously expands braces in $v.
* Apparently, on unquoted $v bash still does globbing * Apparently, on unquoted $v bash still does globbing
* ("v='*.txt'; echo $v" prints all .txt files), * ("v='*.txt'; echo $v" prints all .txt files),
@ -2029,7 +2012,7 @@ static void o_addblock_duplicate_backslash(o_string *o, const char *str, int len
* We have only second one. * We have only second one.
*/ */
#ifdef HUSH_BRACE_EXP #ifdef HUSH_BRACE_EXPANSION
# define MAYBE_BRACES "{}" # define MAYBE_BRACES "{}"
#else #else
# define MAYBE_BRACES "" # define MAYBE_BRACES ""
@ -2197,7 +2180,7 @@ static int o_get_last_ptr(o_string *o, int n)
return ((int)(uintptr_t)list[n-1]) + string_start; return ((int)(uintptr_t)list[n-1]) + string_start;
} }
#ifdef HUSH_BRACE_EXP #ifdef HUSH_BRACE_EXPANSION
/* There in a GNU extension, GLOB_BRACE, but it is not usable: /* There in a GNU extension, GLOB_BRACE, but it is not usable:
* first, it processes even {a} (no commas), second, * first, it processes even {a} (no commas), second,
* I didn't manage to make it return strings when they don't match * I didn't manage to make it return strings when they don't match
@ -2393,7 +2376,7 @@ static int perform_glob(o_string *o, int n)
return n; return n;
} }
#else /* !HUSH_BRACE_EXP */ #else /* !HUSH_BRACE_EXPANSION */
/* Helper */ /* Helper */
static int glob_needed(const char *s) static int glob_needed(const char *s)
@ -2470,7 +2453,7 @@ static int perform_glob(o_string *o, int n)
return n; return n;
} }
#endif /* !HUSH_BRACE_EXP */ #endif /* !HUSH_BRACE_EXPANSION */
/* If o->o_expflags & EXP_FLAG_GLOB, glob the string so far remembered. /* If o->o_expflags & EXP_FLAG_GLOB, glob the string so far remembered.
* Otherwise, just finish current list[] and start new */ * Otherwise, just finish current list[] and start new */
@ -4387,6 +4370,24 @@ static int process_command_subs(o_string *dest, const char *s);
* followed by strings themselves. * followed by strings themselves.
* Caller can deallocate entire list by single free(list). */ * Caller can deallocate entire list by single free(list). */
/* A horde of its helpers come first: */
static void o_addblock_duplicate_backslash(o_string *o, const char *str, int len)
{
while (--len >= 0) {
o_addchr(o, *str);
if (*str++ == '\\') {
/* \z -> \\\z; \<eol> -> \\<eol> */
o_addchr(o, '\\');
if (len) {
len--;
o_addchr(o, '\\');
o_addchr(o, *str++);
}
}
}
}
/* Store given string, finalizing the word and starting new one whenever /* Store given string, finalizing the word and starting new one whenever
* we encounter IFS char(s). This is used for expanding variable values. * we encounter IFS char(s). This is used for expanding variable values.
* End-of-string does NOT finalize word: think about 'echo -$VAR-' */ * End-of-string does NOT finalize word: think about 'echo -$VAR-' */
@ -4395,9 +4396,9 @@ static int expand_on_ifs(o_string *output, int n, const char *str)
while (1) { while (1) {
int word_len = strcspn(str, G.ifs); int word_len = strcspn(str, G.ifs);
if (word_len) { if (word_len) {
if (!(output->o_expflags & EXP_FLAG_GLOB)) if (!(output->o_expflags & EXP_FLAG_GLOB)) {
o_addblock(output, str, word_len); o_addblock(output, str, word_len);
else { } else {
/* Protect backslashes against globbing up :) /* Protect backslashes against globbing up :)
* Example: "v='\*'; echo b$v" prints "b\*" * Example: "v='\*'; echo b$v" prints "b\*"
* (and does not try to glob on "*") * (and does not try to glob on "*")