diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2010-11-18 10:07:55 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2010-11-18 10:07:55 +0000 |
commit | 23bdfc7fd2a012d5205ed22d18eb39e41c8fbc95 (patch) | |
tree | 80d7f0e6c868a1283f3275cf88e08b8c86d509c1 /Src/lex.c | |
parent | 851b8e151004ec729dad9c8c7867bbf67649df8e (diff) | |
download | zsh-23bdfc7fd2a012d5205ed22d18eb39e41c8fbc95.tar.gz zsh-23bdfc7fd2a012d5205ed22d18eb39e41c8fbc95.tar.xz zsh-23bdfc7fd2a012d5205ed22d18eb39e41c8fbc95.zip |
28418: add ${NAME:OFFSET:LENGTH} substitution
Diffstat (limited to 'Src/lex.c')
-rw-r--r-- | Src/lex.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/Src/lex.c b/Src/lex.c index 28899fef0..fdb4b98ac 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -1398,7 +1398,12 @@ gettokstr(int c, int sub) } -/* Return non-zero for error (character to unget), else zero */ +/* + * Parse input as if in double quotes. + * endchar is the end character to expect. + * sub has got something to do with whether we are doing quoted substitution. + * Return non-zero for error (character to unget), else zero + */ /**/ static int @@ -1591,14 +1596,20 @@ parsestrnoerr(char *s) return err; } +/* + * Parse a subscript in string s. + * sub is passed down to dquote_parse(). + * endchar is the final character. + * Return the next character, or NULL. + */ /**/ mod_export char * -parse_subscript(char *s, int sub) +parse_subscript(char *s, int sub, int endchar) { int l = strlen(s), err; char *t; - if (!*s || *s == ']') + if (!*s || *s == endchar) return 0; lexsave(); untokenize(t = dupstring(s)); @@ -1607,15 +1618,16 @@ parse_subscript(char *s, int sub) len = 0; bptr = tokstr = s; bsiz = l + 1; - err = dquote_parse(']', sub); + err = dquote_parse(endchar, sub); if (err) { err = *bptr; - *bptr = 0; + *bptr = '\0'; untokenize(s); *bptr = err; - s = 0; - } else + s = NULL; + } else { s = bptr; + } strinend(); inpop(); DPUTS(cmdsp, "BUG: parse_subscript: cmdstack not empty."); |