summaryrefslogtreecommitdiff
path: root/Src/Modules/zutil.c
diff options
context:
space:
mode:
authorAxel Beckert <abe@deuxchevaux.org>2015-05-28 02:27:03 +0200
committerAxel Beckert <abe@deuxchevaux.org>2015-05-28 02:27:03 +0200
commitfd2ef9a80430c1f4f4ae222af228b485c484dd64 (patch)
tree58e2e652beebfed85a7e0545cf81a24f2c74cf09 /Src/Modules/zutil.c
parentf14d3594049e553de8d61e5fc1d2fa245410a867 (diff)
parentfd786a5c8abf1942a05ed8c470b06cc0b4aa5174 (diff)
downloadzsh-fd2ef9a80430c1f4f4ae222af228b485c484dd64.tar.gz
zsh-fd2ef9a80430c1f4f4ae222af228b485c484dd64.zip
Merge branch 'upstream' and tag 'zsh-5.0.7-dev-4' into 'debian'
Diffstat (limited to 'Src/Modules/zutil.c')
-rw-r--r--Src/Modules/zutil.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index c89495070..376cd8402 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -914,6 +914,9 @@ bin_zformat(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
{
char **ap, *cp;
int nbc = 0, colon = 0, pre = 0, suf = 0;
+#ifdef MULTIBYTE_SUPPORT
+ int prechars = 0;
+#endif /* MULTIBYTE_SUPPORT */
for (ap = args + 2; *ap; ap++) {
for (nbc = 0, cp = *ap; *cp && *cp != ':'; cp++)
@@ -921,10 +924,23 @@ bin_zformat(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
cp++, nbc++;
if (*cp == ':' && cp[1]) {
int d;
+#ifdef MULTIBYTE_SUPPORT
+ int dchars = 0;
+#endif /* MULTIBYTE_SUPPORT */
colon++;
if ((d = cp - *ap - nbc) > pre)
pre = d;
+#ifdef MULTIBYTE_SUPPORT
+ if (isset(MULTIBYTE)) {
+ *cp = '\0';
+ dchars = MB_METASTRWIDTH(*ap) - nbc;
+ *cp = ':';
+ } else
+ dchars = d;
+ if (dchars > prechars)
+ prechars = dchars;
+#endif /* MULTIBYTE_SUPPORT */
if ((d = strlen(cp + 1)) > suf)
suf = d;
}
@@ -937,8 +953,10 @@ bin_zformat(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
ret = (char **) zalloc((arrlen(args + 2) + 1) *
sizeof(char *));
+#ifndef MULTIBYTE_SUPPORT
memcpy(buf + pre, args[1], sl);
suf = pre + sl;
+#endif /* MULTIBYTE_SUPPORT */
for (rp = ret, ap = args + 2; *ap; ap++) {
copy = dupstring(*ap);
@@ -950,9 +968,27 @@ bin_zformat(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
oldc = *cpp;
*cpp = '\0';
if (((cpp == cp && oldc == ':') || *cp == ':') && cp[1]) {
+#ifdef MULTIBYTE_SUPPORT
+ int rempad;
+ char *ptr;
+ memcpy(buf, copy, (cpp - copy));
+ *cp = '\0';
+ if (isset(MULTIBYTE))
+ rempad = prechars - MB_METASTRWIDTH(copy);
+ else
+ rempad = prechars - strlen(copy);
+ ptr = buf + (cpp - copy);
+ if (rempad)
+ memset(ptr, ' ', rempad);
+ ptr += rempad;
+ memcpy(ptr, args[1], sl);
+ ptr += sl;
+ strcpy(ptr, cp + 1);
+#else /* MULTIBYTE_SUPPORT */
memset(buf, ' ', pre);
memcpy(buf, copy, (cpp - copy));
strcpy(buf + suf, cp + 1);
+#endif /* MULTIBYTE_SUPPORT */
*rp++ = ztrdup(buf);
} else
*rp++ = ztrdup(copy);