diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-02-24 15:32:36 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-02-24 15:32:36 +0000 |
commit | 691dd7e5294d232a7ab8327e2038f9779732fa3c (patch) | |
tree | 9d73edabb8e0c4c26a7cf60ceceb3cc23e74d8dd | |
parent | c4a4c1340abeaedda251b90e99e4c9ae77880848 (diff) | |
download | zsh-691dd7e5294d232a7ab8327e2038f9779732fa3c.tar.gz zsh-691dd7e5294d232a7ab8327e2038f9779732fa3c.tar.xz zsh-691dd7e5294d232a7ab8327e2038f9779732fa3c.zip |
20861: Fix statusline in Unicode, apart from isearch
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | Src/Zle/complist.c | 49 | ||||
-rw-r--r-- | Src/Zle/zle.h | 4 | ||||
-rw-r--r-- | Src/Zle/zle_hist.c | 6 | ||||
-rw-r--r-- | Src/Zle/zle_main.c | 6 | ||||
-rw-r--r-- | Src/Zle/zle_misc.c | 61 | ||||
-rw-r--r-- | Src/Zle/zle_refresh.c | 17 | ||||
-rw-r--r-- | Src/Zle/zle_thingy.c | 9 | ||||
-rw-r--r-- | Src/Zle/zle_vi.c | 4 |
9 files changed, 106 insertions, 57 deletions
diff --git a/ChangeLog b/ChangeLog index 02d4d3448..b754c96ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-02-24 Peter Stephenson <pws@csr.com> + + * 20861: Src/Zle/complist.c, Src/Zle/zle.h, Src/Zle/zle_hist.c, + Src/Zle/zle_main.c, Src/Zle/zle_misc.c, Src/Zle/zle_refresh.c, + Src/Zle/zle_thingy.c, Src/Zle/zle_vi.c: Fix use of statusline + with Unicode, apart from isearch. + 2005-02-23 Andrey Borzenkov <bor@zsh.org> * 20857 (modified): Src/Zle/zle.h, Src/Zle/zle_refresh.c: use diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c index a4e9dcbd9..51b160919 100644 --- a/Src/Zle/complist.c +++ b/Src/Zle/complist.c @@ -2115,8 +2115,8 @@ domenuselect(Hookdef dummy, Chdata dat) } first = 0; if (mode == MM_INTER) { - statusline = status; - statusll = strlen(status); + statusline = stringaszleline((unsigned char *)status, + &statusll, NULL); } else if (mode) { int l = sprintf(status, "%s%sisearch%s: ", ((msearchstate & MS_FAILED) ? "failed " : ""), @@ -2125,15 +2125,18 @@ domenuselect(Hookdef dummy, Chdata dat) strncat(status, msearchstr, MAX_STATUS - l - 1); - statusline = status; - statusll = strlen(status); + statusline = stringaszleline((unsigned char *)status, + &statusll, NULL); } else { statusline = NULL; statusll = 0; } zrefresh(); - statusline = NULL; - statusll = 0; + if (statusline) { + free(statusline); + statusline = NULL; + statusll = 0; + } inselect = 1; if (noselect) { broken = 1; @@ -2291,9 +2294,13 @@ domenuselect(Hookdef dummy, Chdata dat) if (nmatches < 1 || !minfo.cur || !*(minfo.cur)) { nolist = 1; if (mode == MM_INTER) { - statusline = status; - statusll = strlen(status); - } + statusline = stringaszleline((unsigned char *)status, + &statusll, NULL); + } else { + /* paranoia */ + statusline = NULL; + statusll = 0; + } if (nmessages) { showinglist = -2; zrefresh(); @@ -2310,8 +2317,11 @@ domenuselect(Hookdef dummy, Chdata dat) zrefresh(); showinglist = clearlist = 0; } - statusline = NULL; - statusll = 0; + if (statusline) { + free(statusline); + statusline = NULL; + statusll = 0; + } goto getk; } @@ -2425,12 +2435,19 @@ domenuselect(Hookdef dummy, Chdata dat) if (nolist) { if (mode == MM_INTER) { - statusline = status; - statusll = strlen(status); - } + statusline = stringaszleline((unsigned char *)status, + &statusll, NULL); + } else { + /* paranoia */ + statusline = NULL; + statusll = 0; + } zrefresh(); - statusline = NULL; - statusll = 0; + if (statusline) { + free(statusline); + statusline = NULL; + statusll = 0; + } goto getk; } if (mode) diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h index 23d5e3cd5..091d9e8e3 100644 --- a/Src/Zle/zle.h +++ b/Src/Zle/zle.h @@ -46,6 +46,7 @@ typedef wint_t ZLE_INT_T; /* Convert character or string to wide character or string */ #define ZWC(c) L ## c +#define ZWS(s) L ## s #define ZLEEOF WEOF @@ -68,8 +69,9 @@ typedef unsigned char *ZLE_STRING_T; typedef int ZLE_INT_T; #define ZLE_CHAR_SIZE sizeof(unsigned char) -/* Leave character or string as is */ +/* Leave character or string as is, but string must be unsigned char * */ #define ZWC(c) c +#define ZWS(s) (unsigned char *)s #define ZLEEOF EOF diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c index 18800fd26..0f8e354fa 100644 --- a/Src/Zle/zle_hist.c +++ b/Src/Zle/zle_hist.c @@ -766,6 +766,10 @@ get_isrch_spot(int num, int *hlp, int *posp, int *csp, int *lenp, int *dirp, int #define NORM_PROMPT_POS 8 #define FIRST_SEARCH_CHAR (NORM_PROMPT_POS + 14) +/* + * TODO: use of isearch buffer and strings need fixing for Unicode. + */ + /**/ static void doisearch(char **args, int dir) @@ -866,7 +870,7 @@ doisearch(char **args, int dir) statusline = ibuf + NORM_PROMPT_POS; } sbuf[sbptr] = '_'; - statusll = sbuf - statusline + sbptr + 1; + statusll = sbuf - (char *)/*TODO*/statusline + sbptr + 1; ref: zrefresh(); if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) { diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index 091012d17..1333e5f75 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -137,7 +137,7 @@ mod_export Widget compwidget; /* the status line, and its length */ /**/ -mod_export char *statusline; +mod_export ZLE_STRING_T statusline; /**/ mod_export int statusll; @@ -1374,8 +1374,8 @@ describekeybriefly(UNUSED(char **args)) if (statusline) return 1; clearlist = 1; - statusline = "Describe key briefly: _"; - statusll = strlen(statusline); + statusline = ZWS("Describe key briefly: _"); + statusll = ZS_strlen(statusline); zrefresh(); seq = getkeymapcmd(curkeymap, &func, &str); statusline = NULL; diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index a017c6709..e9082255f 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -738,7 +738,11 @@ makequote(ZLE_STRING_T str, size_t *len) return ol; } -static char *cmdbuf; +/* + * cmdstr is the buffer used for execute-named-command converted + * to a metafied multibyte string. + */ +static char *cmdstr; static LinkList cmdll; static int cmdambig; @@ -749,7 +753,7 @@ scancompcmd(HashNode hn, UNUSED(int flags)) int l; Thingy t = (Thingy) hn; - if(strpfx(cmdbuf, t->nam)) { + if(strpfx(cmdstr, t->nam)) { addlinknode(cmdll, t->nam); l = pfxlen(peekfirst(cmdll), t->nam); if (l < cmdambig) @@ -765,20 +769,22 @@ Thingy executenamedcommand(char *prmt) { Thingy cmd; - int len, l = strlen(prmt), feep = 0, listed = 0, curlist = 0; + int l, len, feep = 0, listed = 0, curlist = 0; int ols = (listshown && validlist), olll = lastlistlen; - char *ptr; + ZLE_STRING_T cmdbuf, ptr, zprmt; char *okeymap = ztrdup(curkeymapname); clearlist = 1; - cmdbuf = zhalloc(l + NAMLEN + 2); - strcpy(cmdbuf, prmt); + zprmt = stringaszleline((unsigned char *)prmt, &l, NULL); + cmdbuf = zhalloc((l + NAMLEN + 2) * ZLE_CHAR_SIZE); + ZS_memcpy(cmdbuf, zprmt, l); + free(zprmt); statusline = cmdbuf; selectkeymap("main", 1); ptr = cmdbuf += l; len = 0; for (;;) { - *ptr = '_'; + *ptr = ZWC('_'); statusll = l + len + 1; zrefresh(); if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) { @@ -814,35 +820,31 @@ executenamedcommand(char *prmt) zmult = zmultsav; } } else if(cmd == Th(z_viquotedinsert)) { - *ptr = '^'; + *ptr = ZWC('^'); zrefresh(); getfullchar(0); if(LASTFULLCHAR == ZLEEOF || !LASTFULLCHAR || len == NAMLEN) feep = 1; else { - /* TODO: convert back to multibyte string */ - *ptr++ = lastchar, len++, curlist = 0; + *ptr++ = LASTFULLCHAR, len++, curlist = 0; } } else if(cmd == Th(z_quotedinsert)) { if(getfullchar(0) == ZLEEOF || !LASTFULLCHAR || len == NAMLEN) feep = 1; else { - /* TODO: convert back to multibyte string */ - *ptr++ = lastchar, len++, curlist = 0; + *ptr++ = LASTFULLCHAR, len++, curlist = 0; } } else if(cmd == Th(z_backwarddeletechar) || cmd == Th(z_vibackwarddeletechar)) { if (len) { - /* TODO: backward full character in multibyte string. Yuk. */ len--, ptr--, curlist = 0; } } else if(cmd == Th(z_killregion) || cmd == Th(z_backwardkillword) || cmd == Th(z_vibackwardkillword)) { if (len) curlist = 0; - /* TODO: backward full character in multibyte string. Yuk. */ - while (len && (len--, *--ptr != '-')); + while (len && (len--, *--ptr != ZWC('-'))); } else if(cmd == Th(z_killwholeline) || cmd == Th(z_vikillline) || cmd == Th(z_backwardkillline)) { len = 0; @@ -855,7 +857,10 @@ executenamedcommand(char *prmt) Thingy r; unambiguous: *ptr = 0; - r = rthingy(cmdbuf); + cmdstr = zlelineasstring(cmdbuf, len, 0, NULL, NULL, 0); + r = rthingy(cmdstr); + free(cmdstr); + cmdstr = NULL; if (!(r->flags & DISABLED)) { unrefthingy(r); statusline = NULL; @@ -881,9 +886,11 @@ executenamedcommand(char *prmt) cmdambig = 100; cmdll = newlinklist(); - *ptr = 0; + cmdstr = zlelineasstring(cmdbuf, len, 0, NULL, NULL, 0); scanhashtable(thingytab, 1, 0, DISABLED, scancompcmd, 0); + free(cmdstr); + cmdstr = NULL; if (empty(cmdll)) { feep = 1; @@ -893,7 +900,7 @@ executenamedcommand(char *prmt) } else if (cmd == Th(z_listchoices) || cmd == Th(z_deletecharorlist)) { int zmultsav = zmult; - *ptr = '_'; + *ptr = ZWC('_'); statusll = l + len + 1; zmult = 1; listlist(cmdll); @@ -901,14 +908,21 @@ executenamedcommand(char *prmt) showinglist = 0; zmult = zmultsav; } else if (!nextnode(firstnode(cmdll))) { - strcpy(ptr = cmdbuf, peekfirst(cmdll)); - ptr += (len = strlen(ptr)); + ZLE_STRING_T ztmp = stringaszleline(peekfirst(cmdll), + &len, NULL); + ZS_memcpy(ptr = cmdbuf, ztmp, len); + ptr += len; + free(ztmp); if(cmd == Th(z_acceptline) || cmd == Th(z_vicmdmode)) goto unambiguous; } else { - strcpy(cmdbuf, peekfirst(cmdll)); + int ltmp; + ZLE_STRING_T ztmp = stringaszleline(peekfirst(cmdll), + <mp, NULL); + ZS_mempcy(cmdbuf, ztmp, ltmp); + free(ztmp); ptr = cmdbuf + cmdambig; - *ptr = '_'; + *ptr = ZWC('_'); if (isset(AUTOLIST) && !(isset(LISTAMBIGUOUS) && cmdambig > len)) { int zmultsav = zmult; @@ -938,8 +952,7 @@ executenamedcommand(char *prmt) feep = 1; } else { - /* TODO: convert back to multibyte string */ - *ptr++ = lastchar, len++, curlist = 0; + *ptr++ = LASTFULLCHAR, len++, curlist = 0; } } } diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 4dca5628a..aa94930fe 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -320,9 +320,8 @@ zrefresh(void) ZLE_STRING_T s, /* pointer into the video buffer */ sen, /* pointer to end of the video buffer (eol) */ t, /* pointer into the real buffer */ - scs; /* pointer to cursor position in real buffer */ - unsigned char *u; /* pointer for status line stuff - TODO convert to wide characters */ + scs, /* pointer to cursor position in real buffer */ + u; /* pointer for status line stuff */ ZLE_STRING_T tmpline, /* line with added pre/post text */ *qbuf; /* tmp */ int tmpcs, tmpll; /* ditto cursor position and line length */ @@ -509,7 +508,11 @@ zrefresh(void) nbuf[ln][winw + 1] = ZWC('\n'); /* text wrapped */ nextline } +#ifdef ZLE_UNICODE_SUPPORT *s++ = ((*t == 127) || (*t > 255)) ? ZWC('?') : (*t | ZWC('@')); +#else + *s++ = (*t == 127) ? ZWC('?') : (*t | ZWC('@')); +#endif } else { /* normal character */ *s++ = *t; } @@ -538,9 +541,9 @@ zrefresh(void) tosln = ln + 1; nbuf[ln][winw + 1] = ZWC('\0'); /* text not wrapped */ snextline - u = (unsigned char *)statusline; - for (; u < (unsigned char *)statusline + statusll; u++) { - if (icntrl(*u)) { /* simplified processing in the status line */ + u = statusline; + for (; u < statusline + statusll; u++) { + if (ZC_icntrl(*u)) { /* simplified processing in the status line */ *s++ = ZWC('^'); if (s == sen) { nbuf[ln][winw + 1] = ZWC('\n'); /* text wrapped */ @@ -771,7 +774,7 @@ refreshline(int ln) /* 0: setup */ nl = nbuf[ln]; rnllen = nllen = nl ? ZS_strlen(nl) : 0; - ol = obuf[ln] ? obuf[ln] : ZWC(""); + ol = obuf[ln] ? obuf[ln] : ZWS(""); ollen = ZS_strlen(ol); /* optimisation: can easily happen for clearing old lines. If the terminal has diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c index 494e1ade5..5885fb10f 100644 --- a/Src/Zle/zle_thingy.c +++ b/Src/Zle/zle_thingy.c @@ -407,7 +407,7 @@ bin_zle_list(UNUSED(char *name), char **args, Options ops, UNUSED(char func)) static int bin_zle_refresh(UNUSED(char *name), char **args, Options ops, UNUSED(char func)) { - char *s = statusline; + ZLE_STRING_T s = statusline; int sl = statusll, ocl = clearlist; if (!zleactive) @@ -416,8 +416,8 @@ bin_zle_refresh(UNUSED(char *name), char **args, Options ops, UNUSED(char func)) statusll = 0; if (*args) { if (**args) { - statusline = *args; - statusll = strlen(statusline); + statusline = stringaszleline((unsigned char *)*args, &statusll, + NULL); } if (*++args) { LinkList l = newlinklist(); @@ -442,6 +442,9 @@ bin_zle_refresh(UNUSED(char *name), char **args, Options ops, UNUSED(char func)) } zrefresh(); + if (statusline) + free(statusline); + clearlist = ocl; statusline = s; statusll = sl; diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c index e4a36b219..f44452550 100644 --- a/Src/Zle/zle_vi.c +++ b/Src/Zle/zle_vi.c @@ -831,8 +831,8 @@ vicapslockpanic(UNUSED(char **args)) { clearlist = 1; zbeep(); - statusline = "press a lowercase key to continue"; - statusll = strlen(statusline); + statusline = ZWS("press a lowercase key to continue"); + statusll = ZS_strlen(statusline); zrefresh(); #ifdef ZLE_UNICODE_SUPPORT while (!iswlower(getfullchar(0))); |