diff options
Diffstat (limited to 'tc.nls.c')
-rw-r--r-- | tc.nls.c | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/tc.nls.c b/tc.nls.c index 7cc6e42bf3387..b7a58bf8307cf 100644 --- a/tc.nls.c +++ b/tc.nls.c @@ -1,4 +1,4 @@ -/* $Header: /p/tcsh/cvsroot/tcsh/tc.nls.c,v 3.23 2010/02/12 22:17:20 christos Exp $ */ +/* $Header: /p/tcsh/cvsroot/tcsh/tc.nls.c,v 3.27 2016/07/17 15:02:44 christos Exp $ */ /* * tc.nls.c: NLS handling */ @@ -32,7 +32,7 @@ */ #include "sh.h" -RCSID("$tcsh: tc.nls.c,v 3.23 2010/02/12 22:17:20 christos Exp $") +RCSID("$tcsh: tc.nls.c,v 3.27 2016/07/17 15:02:44 christos Exp $") #ifdef WIDE_STRINGS @@ -64,7 +64,11 @@ NLSWidth(Char c) { # ifdef HAVE_WCWIDTH int l; +#if INVALID_BYTE != 0 + if ((c & INVALID_BYTE) == INVALID_BYTE) /* c >= INVALID_BYTE */ +#else if (c & INVALID_BYTE) +#endif return 1; l = xwcwidth((wchar_t) c); return l >= 0 ? l : 0; @@ -116,14 +120,29 @@ NLSChangeCase(const Char *p, int mode) } int -NLSClassify(Char c, int nocomb) +NLSClassify(Char c, int nocomb, int drawPrompt) { int w; - if (c & INVALID_BYTE) +#ifndef SHORT_STRINGS + if ((c & 0x80) != 0) /* c >= 0x80 */ return NLSCLASS_ILLEGAL; - w = NLSWidth(c); - if ((w > 0 && !(Iscntrl(c) && (c & CHAR) < 0x100)) || (Isprint(c) && !nocomb)) - return w; +#endif + if (!drawPrompt) { /* draw command-line */ +#if INVALID_BYTE != 0 + if ((c & INVALID_BYTE) == INVALID_BYTE) /* c >= INVALID_BYTE */ + return NLSCLASS_ILLEGAL; + if ((c & INVALID_BYTE) == QUOTE && (c & 0x80) == 0) /* c >= QUOTE */ + return 1; + if (c >= 0x10000000) /* U+10000000 = FC 90 80 80 80 80 */ + return NLSCLASS_ILLEGAL5; + if (c >= 0x1000000) /* U+1000000 = F9 80 80 80 80 */ + return NLSCLASS_ILLEGAL4; + if (c >= 0x100000) /* U+100000 = F4 80 80 80 */ + return NLSCLASS_ILLEGAL3; +#endif + if (c >= 0x10000) /* U+10000 = F0 90 80 80 */ + return NLSCLASS_ILLEGAL2; + } if (Iscntrl(c) && (c & CHAR) < 0x100) { if (c == '\n') return NLSCLASS_NL; @@ -131,13 +150,14 @@ NLSClassify(Char c, int nocomb) return NLSCLASS_TAB; return NLSCLASS_CTRL; } -#ifdef WIDE_STRINGS - if (c >= 0x1000000) - return NLSCLASS_ILLEGAL4; - if (c >= 0x10000) - return NLSCLASS_ILLEGAL3; -#endif - if (c >= 0x100) - return NLSCLASS_ILLEGAL2; + w = NLSWidth(c); + if (drawPrompt) { /* draw prompt */ + if (w > 0) + return w; + if (w == 0) + return 1; + } + if ((w > 0 && !(Iscntrl(c) && (c & CHAR) < 0x100)) || (Isprint(c) && !nocomb)) + return w; return NLSCLASS_ILLEGAL; } |