1
0
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:
Peter Stephenson 2006-06-28 14:34:27 +00:00
parent 6157c14d06
commit 92737d2c42
3 changed files with 31 additions and 14 deletions

@ -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

@ -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);
}
}
/*