Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: extended ${(#)...}
- X-seq: zsh-workers 22526
- From: Peter Stephenson <pws@xxxxxxx>
- To: zsh-workers@xxxxxxxxxx (Zsh hackers list)
- Subject: PATCH: extended ${(#)...}
- Date: Wed, 28 Jun 2006 15:25:42 +0100
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
Another way of getting Unicode characters, this time directly from
numbers in parameters. For example, ${(#):-0xa5} is a Yen sign.
Note this is strictly Unicode, not the current character set.
I was lazy and hijacked \Uxxxxxxxx. Really that junk of getkeystring()
needs separating out.
Index: Doc/Zsh/expn.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/expn.yo,v
retrieving revision 1.66
diff -u -r1.66 expn.yo
--- Doc/Zsh/expn.yo 22 May 2006 09:52:34 -0000 1.66
+++ Doc/Zsh/expn.yo 28 Jun 2006 14:23:10 -0000
@@ -649,6 +649,9 @@
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
Index: Src/subst.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/subst.c,v
retrieving revision 1.52
diff -u -r1.52 subst.c
--- Src/subst.c 28 Jun 2006 13:12:55 -0000 1.52
+++ Src/subst.c 28 Jun 2006 14:23:12 -0000
@@ -889,6 +889,29 @@
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 @@
/*
* 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 @@
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);
}
}
/*
--
Peter Stephenson <pws@xxxxxxx> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
To access the latest news from CSR copy this link into a web browser: http://www.csr.com/email_sig.php
Messages sorted by:
Reverse Date,
Date,
Thread,
Author