mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-09-28 15:01:21 +02:00
22526: enhance ${(#)...} to handle Unicode
This commit is contained in:
parent
6157c14d06
commit
92737d2c42
@ -1,5 +1,8 @@
|
||||
2006-06-28 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 22526: Doc/Zsh/expn.yo, Src/subst.c: enhance${(#)...} to output
|
||||
Unicode.
|
||||
|
||||
* 22525: Completion/compinit, Src/hist.c, Src/jobs.c,
|
||||
Src/pattern.c, Src/subst.c, Src/utils.c, Src/zsh.h,
|
||||
Test/D07multibyte.ztst: lengths and cases of multibyte strings
|
||||
|
@ -649,6 +649,9 @@ item(tt(#))(
|
||||
Evaluate the resulting words as numeric expressions and output the
|
||||
characters corresponding to the resulting integer. Note that this form is
|
||||
entirely distinct from use of the tt(#) without parentheses.
|
||||
|
||||
If the tt(MULTIBYTE) option is set and the number is greater than 127
|
||||
(i.e. not an ASCII character) it is treated as a Unicode character.
|
||||
)
|
||||
item(tt(%))(
|
||||
Expand all tt(%) escapes in the resulting words in the same way as in in
|
||||
|
39
Src/subst.c
39
Src/subst.c
@ -889,6 +889,29 @@ subst_parse_str(char **sp, int single, int err)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Evaluation for (#) flag */
|
||||
|
||||
static char *
|
||||
substevalchar(char *ptr)
|
||||
{
|
||||
zlong ires = mathevali(ptr);
|
||||
|
||||
if (errflag)
|
||||
return NULL;
|
||||
if (isset(MULTIBYTE) && ires > 127) {
|
||||
char buf[10];
|
||||
int dummy;
|
||||
|
||||
/* inefficient: should separate out \U handling from getkeystring */
|
||||
sprintf(buf, "\\U%.8x", (unsigned int)ires);
|
||||
return getkeystring(buf, &dummy, 2, NULL);
|
||||
} else {
|
||||
ptr = zhalloc(2);
|
||||
sprintf(ptr, "%c", (int)ires);
|
||||
return ptr;
|
||||
}
|
||||
}
|
||||
|
||||
/* parameter substitution */
|
||||
|
||||
#define isstring(c) ((c) == '$' || (char)(c) == String || (char)(c) == Qstring)
|
||||
@ -2269,13 +2292,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
|
||||
/*
|
||||
* Evaluate the value numerically and output the result as
|
||||
* a character.
|
||||
*
|
||||
* Note this doesn't yet handle Unicode or multibyte characters:
|
||||
* that will need handling more generally probably by
|
||||
* an additional flag of some sort.
|
||||
*/
|
||||
zlong ires;
|
||||
|
||||
if (isarr) {
|
||||
char **aval2, **avptr, **av2ptr;
|
||||
|
||||
@ -2283,20 +2300,14 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
|
||||
|
||||
for (avptr = aval, av2ptr = aval2; *avptr; avptr++, av2ptr++)
|
||||
{
|
||||
ires = mathevali(*avptr);
|
||||
if (errflag)
|
||||
if (!(*av2ptr = substevalchar(*avptr)))
|
||||
return NULL;
|
||||
*av2ptr = zhalloc(2);
|
||||
sprintf(*av2ptr, "%c", (int)ires);
|
||||
}
|
||||
*av2ptr = NULL;
|
||||
aval = aval2;
|
||||
} else {
|
||||
ires = mathevali(val);
|
||||
if (errflag)
|
||||
if (!(val = substevalchar(val)))
|
||||
return NULL;
|
||||
val = zhalloc(2);
|
||||
sprintf(val, "%c", (int)ires);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user