summaryrefslogtreecommitdiff
path: root/tc.nls.c
diff options
context:
space:
mode:
Diffstat (limited to 'tc.nls.c')
-rw-r--r--tc.nls.c50
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;
}