ksh/ksh93-shift_ijs.dif

398 lines
10 KiB
Plaintext
Raw Normal View History

--- src/cmd/ksh93/edit/edit.c
+++ src/cmd/ksh93/edit/edit.c 2006-04-19 12:17:59.000000000 +0200
@@ -28,6 +28,7 @@
*/
#include <ast.h>
+#include <ast_wchar.h>
#include <errno.h>
#include <ccode.h>
#include <ctype.h>
@@ -53,7 +54,15 @@
#define CURSOR_UP "\E[A"
#if SHOPT_MULTIBYTE
-# define is_print(c) ((c&~STRIP) || isprint(c))
+# if _hdr_wctype
+# include <wctype.h>
+# define is_print(c) iswprint((c))
+# else
+# define is_print(c) (((c)&~STRIP) || isprint((c)))
+# endif
+# if !_lib_iswprint && !defined(iswprint)
+# define iswprint(c) (((c)&~STRIP) || isprint((c)))
+# endif
#else
# define is_print(c) isprint(c)
#endif
@@ -1166,7 +1175,6 @@
{
if(curp == sp)
r = dp - phys;
- d = (is_print(c)?1:-1);
#if SHOPT_MULTIBYTE
d = mbwidth((wchar_t)c);
if(d==1 && !is_print(c))
@@ -1183,7 +1191,9 @@
continue;
}
else
-#endif /* SHOPT_MULTIBYTE */
+#else /* not SHOPT_MULTIBYTE */
+ d = (is_print(c)?1:-1);
+#endif /* not SHOPT_MULTIBYTE */
if(d<0)
{
if(c=='\t')
--- src/cmd/ksh93/edit/vi.c
+++ src/cmd/ksh93/edit/vi.c 2006-04-19 12:17:59.000000000 +0200
@@ -28,6 +28,8 @@
* cbosgd!pds
-*/
+#include <ast.h>
+#include <ast_wchar.h>
#if KSHELL
# include "defs.h"
@@ -65,10 +67,16 @@
# define gencpy(a,b) ed_gencpy(a,b)
# define genncpy(a,b,n) ed_genncpy(a,b,n)
# define genlen(str) ed_genlen(str)
-# define digit(c) ((c&~STRIP)==0 && isdigit(c))
-# define is_print(c) ((c&~STRIP) || isprint(c))
+# if _hdr_wctype
+# include <wctype.h>
+# define digit(c) iswdigit((c))
+# define is_print(c) iswprint((c))
+# else
+# define digit(c) (((c)&~STRIP)==0 && isdigit((c)))
+# define is_print(c) (((c)&~STRIP) || isprint((c)))
+# endif
# if !_lib_iswprint && !defined(iswprint)
-# define iswprint(c) is_print((c))
+# define iswprint(c) (((c)&~STRIP) || isprint((c)))
# endif
static int _isalph(int);
static int _ismetach(int);
--- src/cmd/ksh93/include/national.h
+++ src/cmd/ksh93/include/national.h 2006-04-19 12:17:59.000000000 +0200
@@ -29,7 +29,7 @@
#if SHOPT_MULTIBYTE
# ifndef MARKER
-# define MARKER 0x7fff /* Must be invalid character */
+# define MARKER 0xdfff /* Must be invalid character */
# endif
extern int sh_strchr(const char*,const char*);
--- src/cmd/ksh93/sh/lex.c
+++ src/cmd/ksh93/sh/lex.c 2006-04-19 12:17:54.000000000 +0200
@@ -293,11 +293,12 @@
{
switch(*len = mbsize(_Fcin.fcptr))
{
- case -1: /* bogus multiByte char - parse as bytes? */
- case 0: /* NULL byte */
+ case -1: /* bogus multiByte char - parse as bytes? */
+ case 0: /* NULL byte */
+ *len = 1;
case 1:
- lexState = state[curChar=fcget()];
- break;
+ lexState = state[curChar=fcget()];
+ break;
default:
/*
* None of the state tables contain entries
@@ -1596,6 +1597,36 @@
{
if(n!=S_NL)
{
+#if SHOPT_MULTIBYTE
+ if(mbwide())
+ {
+ do
+ {
+ ssize_t len;
+ switch((len = mbsize(_Fcin.fcptr)))
+ {
+ case -1: /* bogus multiByte char - parse as bytes? */
+ case 0: /* NULL byte */
+ case 1:
+ n = state[fcget()];
+ break;
+ default:
+ /*
+ * None of the state tables contain
+ * entries for multibyte characters,
+ * however, they should be treated
+ * the same as any other alph
+ * character. Therefore, we'll use
+ * the state of the 'a' character.
+ */
+ mbchar(_Fcin.fcptr);
+ n = state['a'];
+ }
+ }
+ while(n == 0);
+ }
+ else
+#endif /* SHOPT_MULTIBYTE */
/* skip over regular characters */
while((n=state[fcget()])==0);
}
--- src/cmd/ksh93/sh/macro.c
+++ src/cmd/ksh93/sh/macro.c 2006-04-19 12:17:54.000000000 +0200
@@ -266,7 +266,38 @@
cp = fcseek(0);
while(1)
{
+#if SHOPT_MULTIBYTE
+ if(mbwide())
+ {
+ do
+ {
+ ssize_t len;
+ switch((len = mbsize(cp)))
+ {
+ case -1: /* bogus multiByte char - parse as bytes? */
+ case 0: /* NULL byte */
+ case 1:
+ n = state[*(unsigned char*)cp++];
+ break;
+ default:
+ /*
+ * None of the state tables contain
+ * entries for multibyte characters,
+ * however, they should be treated
+ * the same as any other alph
+ * character. Therefore, we'll use
+ * the state of the 'a' character.
+ */
+ cp += len;
+ n = state['a'];
+ }
+ }
+ while(n == 0);
+ }
+ else
+#endif /* SHOPT_MULTIBYTE */
while((n=state[*(unsigned char*)cp++])==0);
+
if(n==S_NL || n==S_QUOTE || n==S_RBRA)
continue;
if(c=(cp-1)-fcseek(0))
@@ -395,8 +426,42 @@
cp++;
while(1)
{
- while((n=state[*(unsigned char*)cp++])==0);
- c = (cp-1) - first;
+#if SHOPT_MULTIBYTE
+ if (mbwide())
+ {
+ ssize_t len;
+ do
+ {
+ switch((len = mbsize(cp)))
+ {
+ case -1: /* bogus multiByte char - parse as bytes? */
+ case 0: /* NULL byte */
+ len = 1;
+ case 1:
+ n = state[*(unsigned char*)cp++];
+ break;
+ default:
+ /*
+ * None of the state tables contain entries
+ * for multibyte characters. However, they
+ * should be treated the same as any other
+ * alpha character, so we'll use the state
+ * which would normally be assigned to the
+ * 'a' character.
+ */
+ cp += len;
+ n = state['a'];
+ }
+ }
+ while(n == 0);
+ c = (cp-len) - first;
+ }
+ else
+#endif /* SHOPT_MULTIBYTE */
+ {
+ while((n=state[*(unsigned char*)cp++])==0);
+ c = (cp-1) - first;
+ }
switch(n)
{
case S_ESC:
--- src/cmd/ksh93/sh/string.c
+++ src/cmd/ksh93/sh/string.c 2006-04-19 12:17:59.000000000 +0200
@@ -24,6 +24,7 @@
*/
#include <ast.h>
+#include <ast_wchar.h>
#include "defs.h"
#include <stak.h>
#include <ctype.h>
@@ -36,8 +37,12 @@
#define mbchar(p) (*(unsigned char*)p++)
#endif
+#if _hdr_wctype
+# include <wctype.h>
+#endif
+
#if !_lib_iswprint && !defined(iswprint)
-# define iswprint(c) ((c&~0377) || isprint(c))
+# define iswprint(c) (((c)&~0377) || isprint((c)))
#endif
@@ -245,8 +250,20 @@
if(sp)
{
dp = sp;
- while(c= *sp++)
+ while((c = *sp))
{
+#if SHOPT_MULTIBYTE
+ if (mbwide()) {
+ int len = mbsize(sp);
+ if (len > 1) {
+ dp += len;
+ sp += len;
+ continue;
+ }
+ }
+#endif /* SHOPT_MULTIBYTE */
+ sp++;
+
if(c == '\\')
c = *sp++;
if(c)
--- src/lib/libast/comp/setlocale.c
+++ src/lib/libast/comp/setlocale.c 2006-04-19 12:17:59.000000000 +0200
@@ -30,6 +30,8 @@
#include "lclib.h"
+#include <ast.h>
+#include <ast_wchar.h>
#include <ctype.h>
#include <mc.h>
#include <namval.h>
--- src/lib/libast/comp/wc.c
+++ src/lib/libast/comp/wc.c 2006-04-19 12:17:59.000000000 +0200
@@ -26,6 +26,7 @@
*/
#include <ast.h>
+#include <ast_wchar.h>
#include <wchar.h>
#if !_lib_mbtowc
--- src/lib/libast/features/wchar
+++ src/lib/libast/features/wchar 2006-04-19 12:25:08.000000000 +0200
@@ -1,5 +1,6 @@
set prototyped
-lib mbstowcs,wctomb,wcrtomb,wcslen,wcstombs,wcwidth stdlib.h stdio.h wchar.h
+lib mbstowcs,wctomb,wcrtomb,wcslen,wcstombs,wcscpy,wcwidth stdlib.h stdio.h wchar.h wctype.h
+lib iswprint,iswalnum stdlib.h stdio.h ctype.h wctype.h
lib towlower,towupper stdlib.h stdio.h wchar.h
typ mbstate_t stdlib.h stdio.h wchar.h
nxt wchar
@@ -30,6 +31,12 @@
#undef putwc
#undef putwchar
#undef ungetwc
+ #undef fwprintf
+ #undef swprintf
+ #undef vfwprintf
+ #undef vswprintf
+ #undef vwprintf
+ #undef wprintf
#define fgetwc _ast_fgetwc
#define fgetws _ast_fgetws
@@ -79,6 +86,12 @@
#if !_lib_wcstombs
extern size_t wcstombs(char*, const wchar_t*, size_t);
#endif
+ #if !_lib_wcscpy
+ extern wchar_t *wcscpy(wchar_t*t, const wchar_t*);
+ #endif
+ #if !_lib_wcwidth
+ extern int int wcwidth(wchar_t c);
+ #endif
extern int fwprintf(FILE*, const wchar_t*, ...);
extern int fwscanf(FILE*, const wchar_t*, ...);
--- src/lib/libast/regex/reglib.h
+++ src/lib/libast/regex/reglib.h 2006-04-19 12:17:59.000000000 +0200
@@ -57,6 +57,7 @@
char re_rhs[1]; /* substitution rhs */
#include <ast.h>
+#include <ast_wchar.h>
#include <cdt.h>
#include <stk.h>
--- src/lib/libcmd/Mamfile
+++ src/lib/libcmd/Mamfile 2006-04-19 12:17:54.000000000 +0200
@@ -444,7 +444,7 @@
prev cat.c
meta cat.o %.c>%.o cat.c cat
prev cat.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} -DERROR_CATALOG=\""libcmd"\" -DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf@research.att.com>][-author?David Korn <dgk@research.att.com>][-copyright?Copyright (c) 1992-2006 AT&T Knowledge Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libcmd]"\" -D_PACKAGE_ast -D_BLD_cmd -c cat.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} -DERROR_CATALOG=\""libcmd"\" -DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf@research.att.com>][-author?David Korn <dgk@research.att.com>][-copyright?Copyright (c) 1992-2006 AT&T Knowledge Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libcmd]"\" -D_PACKAGE_ast -D_BLD_cmd -DSHOPT_MULTIBYTE -c cat.c
done cat.o generated
make chgrp.o
prev chgrp.c
--- src/lib/libcmd/cat.c
+++ src/lib/libcmd/cat.c 2006-04-19 12:17:54.000000000 +0200
@@ -133,8 +133,39 @@
while (endbuff)
{
cpold = cp;
- /* skip over ASCII characters */
+ /* skip over ASCII and multi byte characters */
+#if SHOPT_MULTIBYTE
+ if(mbwide())
+ {
+ do
+ {
+ ssize_t len;
+ switch((len = mbsize(cp)))
+ {
+ case -1: /* bogus multiByte char - parse as bytes? */
+ case 0: /* NULL byte */
+ case 1:
+ n = states[*cp++];
+ break;
+ default:
+ /*
+ * None of the state tables contain
+ * entries for multibyte characters,
+ * however, they should be treated
+ * the same as any other alph
+ * character. Therefore, we'll use
+ * the state of the 'a' character.
+ */
+ cp += len;
+ n = states['a'];
+ }
+ }
+ while(n == 0);
+ }
+ else
+#endif /* SHOPT_MULTIBYTE */
while ((n = states[*cp++]) == 0);
+
if (n==T_ENDBUF)
{
if (cp>endbuff)