summaryrefslogtreecommitdiff
path: root/Src/subst.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-07-10 13:08:22 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-07-10 13:08:22 +0000
commit4a67f2479892fda348546404216270aaaff523ea (patch)
tree3157f967e4324cdf147aa656c021e55e96f29731 /Src/subst.c
parent272256f5d6f4748aed680256589a67713e517383 (diff)
downloadzsh-4a67f2479892fda348546404216270aaaff523ea.tar.gz
zsh-4a67f2479892fda348546404216270aaaff523ea.zip
22544: Improve use of ztype tests for multibyte characters. Add
POSIX_IDENTIFIERS option to control allowability of multibyte alphanumeric characters in parameter and module names.
Diffstat (limited to 'Src/subst.c')
-rw-r--r--Src/subst.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/Src/subst.c b/Src/subst.c
index 12df115a0..821c1c79a 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -475,15 +475,14 @@ filesubstr(char **namptr, int assign)
return 0;
*namptr = dyncat(ds, ptr);
return 1;
- } else if (iuser(str[1])) { /* ~foo */
- char *ptr, *hom, save;
+ } else if ((ptr = itype_end(str+1, IUSER, 0)) != str+1) { /* ~foo */
+ char *hom, save;
- for (ptr = ++str; *ptr && iuser(*ptr); ptr++);
save = *ptr;
if (!isend(save))
return 0;
*ptr = 0;
- if (!(hom = getnameddir(str))) {
+ if (!(hom = getnameddir(++str))) {
if (isset(NOMATCH))
zerr("no such user or named directory: %s", str);
*ptr = save;
@@ -1146,9 +1145,10 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
* Shouldn't this be a table or something? We test for all
* these later on, too.
*/
- if (!ialnum(c = *s) && c != '#' && c != Pound && c != '-' &&
- c != '!' && c != '$' && c != String && c != Qstring &&
- c != '?' && c != Quest && c != '_' &&
+ c = *s;
+ if (itype_end(s, IIDENT, 1) == s && *s != '#' && c != Pound &&
+ c != '-' && c != '!' && c != '$' && c != String && c != Qstring &&
+ c != '?' && c != Quest &&
c != '*' && c != Star && c != '@' && c != '{' &&
c != Inbrace && c != '=' && c != Equals && c != Hat &&
c != '^' && c != '~' && c != Tilde && c != '+') {
@@ -1446,8 +1446,8 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
} else
spbreak = 2;
} else if ((c == '#' || c == Pound) &&
- (iident(cc = s[1])
- || cc == '*' || cc == Star || cc == '@'
+ (itype_end(s+1, IIDENT, 0) != s + 1
+ || (cc = s[1]) == '*' || cc == Star || cc == '@'
|| cc == '-' || (cc == ':' && s[2] == '-')
|| (isstring(cc) && (s[2] == Inbrace || s[2] == Inpar)))) {
getlen = 1 + whichlen, s++;
@@ -1471,7 +1471,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
* Try to handle this when parameter is named
* by (P) (second part of test).
*/
- if (iident(s[1]) || (aspar && isstring(s[1]) &&
+ if (itype_end(s+1, IIDENT, 0) != s+1 || (aspar && isstring(s[1]) &&
(s[2] == Inbrace || s[2] == Inpar)))
chkset = 1, s++;
else if (!inbrace) {