diff options
author | Daniel Shahaf <d.s@daniel.shahaf.name> | 2021-04-03 02:49:54 +0000 |
---|---|---|
committer | Daniel Shahaf <d.s@daniel.shahaf.name> | 2021-04-08 02:19:39 +0000 |
commit | 4ba9008ec7842770289645dc6a8829555915086b (patch) | |
tree | 4ffe5d56aa7cb1d598edeb1ca94237d1cfee5091 /Src | |
parent | 295fbc0998db7204a9eb68f46c8bedab171ff387 (diff) | |
download | zsh-4ba9008ec7842770289645dc6a8829555915086b.tar.gz zsh-4ba9008ec7842770289645dc6a8829555915086b.tar.xz zsh-4ba9008ec7842770289645dc6a8829555915086b.zip |
48379: Make the parameter expansion subscript flags parse error message, "error in flags", identify the location of the parse error.
Diffstat (limited to 'Src')
-rw-r--r-- | Src/subst.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/Src/subst.c b/Src/subst.c index 8f5bd355e..96e0914eb 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2259,9 +2259,31 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, break; default: - flagerr: - zerr("error in flags"); - return NULL; + flagerr: + { + /* + * We're trying to output the string that failed to + * parse and the offset of the parse error within that. + * + * The string is *str. It hasn't been changed since + * entry to this function, I think, except that the + * first non-variable-declaration line in this function + * (currently the 238th line in this function) + * writes a NUL to the first place in *str, so we'll + * compensate by outputting the dollar sign manually. + */ + char *str_copy_for_output = dupstring(*str + 1); + + /* + * Convert to a 1-based offset, because the shell + * language is 1-based by default. + */ + zlong offset = s - *str + 1; + + untokenize(str_copy_for_output); + zerr("error in flags near position %z in '$%s'", offset, str_copy_for_output); + return NULL; + } } } s++; |