[comp.sources.x] v04i011: kterm -- Kanji

argv@island.uu.net (Dan Heller) (05/31/89)

Submitted-by: Hiroto Kagotani <kagotani@cs.titech.ac.jp>
Posting-number: Volume 4, Issue 11
Archive-name: kterm/part02

diff -rc ../xterm/Imakefile ./Imakefile
*** ../xterm/Imakefile	Thu May  4 20:19:15 1989
--- ./Imakefile	Tue May 30 14:53:21 1989
***************
*** 25,46 ****
  #define GettyProgram /* as nothing */
  #endif
  /* add -DWTMP and -DLASTLOG if you want them */
!         DEFINES = -DMODEMENU -DUTMP -DBcopy=bcopy GettyProgram
            SRCS1 = button.c charproc.c cursor.c data.c input.c \
  		  main.c menu.c misc.c screen.c scrollbar.c tabs.c \
! 		  TekPrsTbl.c Tekproc.c util.c VTPrsTbl.c
            OBJS1 = main.o input.o charproc.o cursor.o util.o tabs.o \
  		  screen.o scrollbar.o button.o Tekproc.o misc.o \
! 		  VTPrsTbl.o TekPrsTbl.o data.o menu.o
!           SRCS2 = resize.c
!           OBJS2 = resize.o
!        PROGRAMS = resize xterm
     INSTALLFLAGS = $(INSTUIDFLAGS)
         INCLUDES = -I$(TOOLKITSRC) -I$(TOP)
  
  
! ComplexProgramTarget_1(xterm,$(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB),-ltermcap)
! 
! SingleProgramTarget(resize,$(OBJS2),,-lc -ltermcap)
! InstallProgramWithFlags(resize, $(BINDIR), )
! InstallManPage(resize,$(MANDIR))
--- 25,43 ----
  #define GettyProgram /* as nothing */
  #endif
  /* add -DWTMP and -DLASTLOG if you want them */
!         DEFINES = -DMODEMENU -DUTMP -DKANJI -DSTATUSLINE \
! 		  -DKEEPALIVE -DBcopy=bcopy GettyProgram
            SRCS1 = button.c charproc.c cursor.c data.c input.c \
  		  main.c menu.c misc.c screen.c scrollbar.c tabs.c \
! 		  TekPrsTbl.c Tekproc.c util.c VTPrsTbl.c \
! 		  convert.c patchlevel.c
            OBJS1 = main.o input.o charproc.o cursor.o util.o tabs.o \
  		  screen.o scrollbar.o button.o Tekproc.o misc.o \
! 		  VTPrsTbl.o TekPrsTbl.o data.o menu.o \
! 		  convert.o patchlevel.o
!        PROGRAMS = kterm
     INSTALLFLAGS = $(INSTUIDFLAGS)
         INCLUDES = -I$(TOOLKITSRC) -I$(TOP)
  
  
! ComplexProgramTarget_1(kterm,$(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB),-ltermcap)
diff -rc ../xterm/VTPrsTbl.c ./VTPrsTbl.c
*** ../xterm/VTPrsTbl.c	Thu May  4 20:19:17 1989
--- ./VTPrsTbl.c	Tue May 30 14:53:26 1989
***************
*** 35,40 ****
--- 35,41 ----
  #include "VTparse.h"
  #ifndef lint
  static char rcs_id[] = "$XConsortium: VTPrsTbl.c,v 1.3 89/01/04 13:37:41 jim Exp $";
+ static char kterm_id[] = "$Header: VTPrsTbl.c,v 1.1 89/05/30 14:53:25 kagotani Rel $";
  #endif	/* lint */
  
  /*
***************
*** 455,465 ****
--- 456,475 ----
  CASE_GROUND_STATE,
  /*	D		E		F		G	*/
  CASE_GROUND_STATE,
+ #ifdef	STATUSLINE	/* michael */
+ CASE_ERASE_STATUS,
+ CASE_FROM_STATUS,
+ #else	STATUSLINE
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
+ #endif	STATUSLINE
  CASE_GROUND_STATE,
  /*	H		I		J		K	*/
+ #ifdef	STATUSLINE	/* michael */
+ CASE_HIDE_STATUS,
+ #else	STATUSLINE
  CASE_GROUND_STATE,
+ #endif	STATUSLINE
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
***************
*** 472,480 ****
--- 482,498 ----
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
+ #ifdef	STATUSLINE	/* michael */
+ CASE_SHOW_STATUS,
+ #else	STATUSLINE
  CASE_GROUND_STATE,
+ #endif	STATUSLINE
  /*	T		U		V		W	*/
+ #ifdef	STATUSLINE	/* michael */
+ CASE_TO_STATUS,
+ #else	STATUSLINE
  CASE_GROUND_STATE,
+ #endif	STATUSLINE
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
***************
*** 741,747 ****
--- 759,769 ----
  CASE_ESC_IGNORE,
  CASE_SCR_STATE,
  /*	$		%		&		'	*/
+ #ifdef	KANJI	/* sano & kagotani */
+ CASE_MBCS,
+ #else	KANJI
  CASE_ESC_IGNORE,
+ #endif	KANJI
  CASE_ESC_IGNORE,
  CASE_ESC_IGNORE,
  CASE_ESC_IGNORE,
***************
*** 1438,1446 ****
--- 1460,1474 ----
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
  /*	H		I		J		K	*/
+ #ifdef	KANJI	/* sano */
+ CASE_GSETS,
+ CASE_GSETS,
+ CASE_GSETS,
+ #else	KANJI
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
+ #endif	KANJI
  CASE_GROUND_STATE,
  /*	L		M		N		O	*/
  CASE_GROUND_STATE,
***************
*** 1508,1510 ****
--- 1536,1703 ----
  CASE_GROUND_STATE,
  CASE_GROUND_STATE,
  };
+ 
+ #ifdef	KANJI	/* kagotani */
+ int mbcstable[] = {
+ /*	NUL		SOH		STX		ETX	*/
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ /*	EOT		ENQ		ACK		BEL	*/
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_BELL,
+ /*	BS		HT		NL		VT	*/
+ CASE_BS,
+ CASE_TAB,
+ CASE_VMOT,
+ CASE_VMOT,
+ /*	NP		CR		SO		SI	*/
+ CASE_VMOT,
+ CASE_CR,
+ CASE_SO,
+ CASE_SI,
+ /*	DLE		DC1		DC2		DC3	*/
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ /*	DC4		NAK		SYN		ETB	*/
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ /*	CAN		EM		SUB		ESC	*/
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_ESC,
+ /*	FS		GS		RS		US	*/
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ CASE_IGNORE,
+ /*	SP		!		"		#	*/
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ /*	$		%		&		'	*/
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ /*	(		)		*		+	*/
+ CASE_SCS0_STATE,
+ CASE_SCS1_STATE,
+ CASE_SCS2_STATE,
+ CASE_SCS3_STATE,
+ /*	,		-		.		/	*/
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ CASE_ESC_IGNORE,
+ /*	0		1		2		3	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	4		5		6		7	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	8		9		:		;	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	<		=		>		?	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	@		A		B		C	*/
+ CASE_GSETS,		/* ESC-$-@ Japanise (JIS-78) */
+ CASE_GROUND_STATE,
+ CASE_GSETS,		/* ESC-$-B Japanese (JIS-83) */
+ CASE_GROUND_STATE,
+ /*	D		E		F		G	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	H		I		J		K	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	L		M		N		O	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	P		Q		R		S	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	T		U		V		W	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	X		Y		Z		[	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	\		]		^		_	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	`		a		b		c	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	d		e		f		g	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	h		i		j		k	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	l		m		n		o	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	p		q		r		s	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	t		u		v		w	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	x		y		z		{	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ /*	|		}		~		DEL	*/
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ CASE_GROUND_STATE,
+ };
+ #endif KANJI
diff -rc ../xterm/VTparse.def ./VTparse.def
*** ../xterm/VTparse.def	Thu May  4 20:19:18 1989
--- ./VTparse.def	Tue May 30 14:53:27 1989
***************
*** 1,5 ****
  #
! # $XConsortium: VTparse.def,v 1.3 89/01/04 13:37:48 jim Exp $
  #
  # List of symbols that need to be defined for VTparse.h.  If you need to 
  # change any of the CASE_ macros, make the change here and rerun the command
--- 1,5 ----
  #
! # $Header: VTparse.def,v 1.1 89/05/30 14:53:27 kagotani Rel $
  #
  # List of symbols that need to be defined for VTparse.h.  If you need to 
  # change any of the CASE_ macros, make the change here and rerun the command
***************
*** 74,76 ****
--- 74,77 ----
  CASE_XTERM_RESTORE
  CASE_XTERM_TITLE
  CASE_DECID
+ CASE_MBCS
diff -rc ../xterm/VTparse.h ./VTparse.h
*** ../xterm/VTparse.h	Thu May  4 20:19:18 1989
--- ./VTparse.h	Tue May 30 14:53:28 1989
***************
*** 1,5 ****
--- 1,6 ----
  /*
   *	$XConsortium: VTparse.h,v 1.4 89/01/04 13:37:49 jim Exp $
+  *	$Header: VTparse.h,v 1.1 89/05/30 14:53:28 kagotani Rel $
   */
  
  
***************
*** 110,112 ****
--- 111,119 ----
  #define CASE_XTERM_RESTORE 65
  #define CASE_XTERM_TITLE 66
  #define CASE_DECID 67
+ #define CASE_MBCS 68
+ #define	CASE_TO_STATUS		69
+ #define	CASE_FROM_STATUS	70
+ #define	CASE_SHOW_STATUS	71
+ #define	CASE_HIDE_STATUS	72
+ #define	CASE_ERASE_STATUS	73
diff -rc ../xterm/button.c ./button.c
*** ../xterm/button.c	Thu May  4 20:19:20 1989
--- ./button.c	Tue May 30 14:53:31 1989
***************
*** 1,5 ****
--- 1,6 ----
  /*
   *	$XConsortium: button.c,v 1.32 89/01/05 12:47:45 swick Exp $
+  *	$Header: button.c,v 1.1 89/05/30 14:53:29 kagotani Rel $
   */
  
  
***************
*** 36,41 ****
--- 37,43 ----
  */
  #ifndef lint
  static char rcs_id[] = "$XConsortium: button.c,v 1.32 89/01/05 12:47:45 swick Exp $";
+ static char kterm_id[] = "$Header: button.c,v 1.1 89/05/30 14:53:29 kagotani Rel $";
  #endif	/* lint */
  #include <X11/Xos.h>
  #include <X11/Xlib.h>
***************
*** 53,58 ****
--- 55,72 ----
  #include "menu.h"
  #endif	/* MODEMENU */
  
+ #ifndef LOCAL_ALLOC
+ #ifdef __GNUC__
+ #define LOCAL_ALLOC(x)	__builtin_alloca(x)
+ #else
+ #define LOCAL_ALLOC(x)	alloca(x)
+ extern char *alloca();
+ #endif
+ #endif
+ #ifndef LOCAL_FREE
+ #define LOCAL_FREE(x)
+ #endif
+ 
  extern char *malloc();
  
  #define KeyState(x) (((x) & (ShiftMask|ControlMask)) + (((x) & Mod1Mask) ? 2 : 0))
***************
*** 69,75 ****
--- 83,98 ----
  #define SHIFTS 8		/* three keys, so eight combinations */
  #define	Coordinate(r,c)		((r) * (term->screen.max_col+1) + (c))
  
+ #ifdef KANJI
+ static AtomPtr	_XA_COMPOUND_TEXT;
+ #define XA_COMPOUND_TEXT(d)	XmuInternAtom(d, _XA_COMPOUND_TEXT)
+ #endif
+ 
+ #ifdef KANJI
+ wchar_t *SaveText();
+ #else
  char *SaveText();
+ #endif
  extern EditorButton();
  
  extern ModeMenu();
***************
*** 251,256 ****
--- 274,285 ----
      Time time;
  };
  
+ #ifdef KANJI
+ SelAtomInitialize()
+ {
+     _XA_COMPOUND_TEXT = XmuMakeAtom("COMPOUND_TEXT");
+ }
+ #endif
  
  static void _GetSelection(w, time, params, num_params)
  Widget w;
***************
*** 293,300 ****
--- 322,334 ----
  	    list->count = num_params;
  	    list->time = time;
  	} else list = NULL;
+ #ifdef KANJI
+ 	XtGetSelectionValue(w, selection, XA_TEXT(XtDisplay(w)), SelectionReceived,
+ 			    (caddr_t)list, time);
+ #else
  	XtGetSelectionValue(w, selection, XA_STRING, SelectionReceived,
  			    (caddr_t)list, time);
+ #endif
      }
  }
  
***************
*** 322,327 ****
--- 356,432 ----
  	return;
      }
  
+ #ifdef KANJI
+     if (*type == XA_STRING) {
+ 	char *p, *q;
+ 	int n = *length;
+ 
+ 	line = LOCAL_ALLOC(n + 1);
+ 	bcopy((char *)value, line, n);
+ 	line[n] = '\0';
+ 	p = (char *)value;
+ 	q = line;
+ 	while (n-- > 0) {
+ 	    if (!(*p & 0x80)) {
+ 		*q++ = *p;
+ 	    }
+ 	    p++;
+ 	}
+ 	end = q;
+     } else if (*type == XA_COMPOUND_TEXT(XtDisplay(w))) {
+ 	unsigned char *ct = (unsigned char *)value;
+ 	wchar_t *ws;
+ 	int (*func)();
+ 	int n;
+ 	int convWStoEUC(), convWStoSJIS(), convWStoJIS();
+ 
+ 	n = convCTtoJWS(ct, *length, NULL);
+ 	if (n < 0) {	/* data broken */
+ 	    XtFree(client_data);
+ 	    XtFree(value);
+ 	    return;
+ 	}
+ 	ws = (wchar_t *)LOCAL_ALLOC((n + 1) * sizeof(wchar_t));
+ 	(void)convCTtoJWS(ct, *length, ws);
+ 
+ 	switch (((XtermWidget)w)->flags & (EUC_KANJI|SJIS_KANJI)) {
+ 	case EUC_KANJI:
+ 	    func = convWStoEUC;
+ 	    break;
+ 	case SJIS_KANJI:
+ 	    func = convWStoSJIS;
+ 	    break;
+ 	default:
+ 	    func = convWStoJIS;
+ 	    break;
+ 	}
+ 
+ 	n = (*func)(ws, NULL);
+ 	line = LOCAL_ALLOC(n + 1);
+ 	(void)(*func)(ws, line);
+ 	end = line + n;
+ 	LOCAL_FREE(ws);
+     } else {
+ 	/* I don't know */
+ 	XtFree(client_data);
+ 	XtFree(value);
+ 	return;
+     }
+     lag = line;
+     for (cp = line; cp != end; cp++)
+ 	{
+ 	    if (*cp != '\n') continue;
+ 	    *cp = '\r';
+ 	    v_write(pty, lag, cp - lag + 1);
+ 	    lag = cp + 1;
+ 	}
+     if (lag != end)
+ 	v_write(pty, lag, end - lag);
+ 
+     LOCAL_FREE(line);
+     XtFree(client_data);
+     XtFree(value);
+ #else
      end = &line[*length];
      lag = line;
      for (cp = line; cp != end; cp++)
***************
*** 336,341 ****
--- 441,447 ----
  
      XtFree(client_data);
      XtFree(value);
+ #endif
  }
  
  
***************
*** 919,925 ****
--- 1025,1035 ----
  {
  	register TScreen *screen = &term->screen;
  	register int i, j = 0;
+ #ifdef KANJI	/* ishisone */
+ 	wchar_t *line, *lp;
+ #else
  	char *line, *lp;
+ #endif
  
  	--col;
  	/* first we need to know how long the string is before we can save it*/
***************
*** 936,942 ****
--- 1046,1059 ----
  	/* now get some memory to save it in */
  
  	if (screen->selection_size <= j) {
+ #ifdef	KANJI	/* ishisone */
+ 	    /*
+ 	     * Selection data are stored in EUC process code
+ 	     */
+ 	    if((line = (wchar_t *)malloc((unsigned)((j + 1) * 2))) == (wchar_t *)NULL)
+ #else	/* KANJI */
  	    if((line = malloc((unsigned) j + 1)) == (char *)NULL)
+ #endif	/* KANJI */
  		SysError(ERROR_BMALLOC2);
  	    XtFree(screen->selection);
  	    screen->selection = line;
***************
*** 957,963 ****
--- 1074,1088 ----
  	}
  	*lp = '\0';		/* make sure we have end marked */
  	
+ #ifdef	KANJI	/* kato */
+ 	/*
+ 	 * (lp - line) should be used to express the length of the converted
+ 	 * Kanji string. j is only its original length.
+ 	 */
+ 	screen->selection_length = lp - line;
+ #else	/* KANJI */
  	screen->selection_length = j;
+ #endif	/* KANJI */
  	_OwnSelection(term, params, num_params);
  }
  
***************
*** 983,988 ****
--- 1108,1116 ----
  		    target, type, (caddr_t*)&std_targets, &std_length, format
  		   );
  	*length = std_length + 4;
+ #ifdef KANJI	/* ishisone */
+ 	*length++;
+ #endif
  	*value = (caddr_t)XtMalloc(sizeof(Atom)*(*length));
  	targetP = *(Atom**)value;
  	*targetP++ = XA_STRING;
***************
*** 989,994 ****
--- 1117,1125 ----
  	*targetP++ = XA_TEXT(d);
  	*targetP++ = XA_LENGTH(d);
  	*targetP++ = XA_LIST_LENGTH(d);
+ #ifdef KANJI	/* ishisone */
+ 	*targetP++ = XA_COMPOUND_TEXT(d);
+ #endif
  	bcopy((char*)std_targets, (char*)targetP, sizeof(Atom)*std_length);
  	XtFree((char*)std_targets);
  	*type = XA_ATOM;
***************
*** 996,1001 ****
--- 1127,1150 ----
  	return True;
      }
  
+ #ifdef KANJI	/* ishisone */
+     if (*target == XA_STRING) {
+ 	*type = XA_STRING;
+ 	*length = convJWStoLatin1(xterm->screen.selection, NULL);
+ 	*value = (caddr_t)XtMalloc(*length + 1);
+ 	(void)convJWStoLatin1(xterm->screen.selection, (wchar_t *)*value);
+ 	*format = 8;
+ 	return True;
+     }
+     if (*target == XA_TEXT(d) || *target == XA_COMPOUND_TEXT(d)) {
+ 	*type = XA_COMPOUND_TEXT(d);
+ 	*length = convJWStoCT(xterm->screen.selection, NULL, 0);
+ 	*value = (caddr_t)XtMalloc(*length + 1);
+ 	(void)convJWStoCT(xterm->screen.selection, (unsigned char *)*value, 0);
+ 	*format = 8;
+ 	return True;
+     }
+ #else
      if (*target == XA_STRING || *target == XA_TEXT(d)) {
  	*type = XA_STRING;
  	*value = xterm->screen.selection;
***************
*** 1003,1008 ****
--- 1152,1158 ----
  	*format = 8;
  	return True;
      }
+ #endif
      if (*target == XA_LIST_LENGTH(d)) {
  	*value = XtMalloc(4);
  	if (sizeof(long) == 4)
***************
*** 1018,1029 ****
--- 1168,1188 ----
      }
      if (*target == XA_LENGTH(d)) {
  	*value = XtMalloc(4);
+ #ifdef KANJI	/* ishisone */
  	if (sizeof(long) == 4)
+ 	    *(long*)*value = convJWStoCT(xterm->screen.selection, NULL, 0);
+ 	else {
+ 	    long temp = convJWStoCT(xterm->screen.selection, NULL, 0);
+ 	    bcopy( ((char*)&temp)+sizeof(long)-4, (char*)*value, 4);
+ 	}
+ #else
+ 	if (sizeof(long) == 4)
  	    *(long*)*value = xterm->screen.selection_length;
  	else {
  	    long temp = xterm->screen.selection_length;
  	    bcopy( ((char*)&temp)+sizeof(long)-4, (char*)*value, 4);
  	}
+ #endif
  	*type = XA_INTEGER;
  	*length = 1;
  	*format = 32;
***************
*** 1081,1086 ****
--- 1240,1246 ----
  }
  
  
+ #ifndef KANJI
  /* ARGSUSED */
  static void SelectionDone(w, selection, target)
  Widget w;
***************
*** 1088,1095 ****
  {
      /* empty proc so Intrinsics know we want to keep storage */
  }
  
- 
  static /* void */ _OwnSelection(term, selections, count)
  register XtermWidget term;
  String *selections;
--- 1248,1255 ----
  {
      /* empty proc so Intrinsics know we want to keep storage */
  }
+ #endif
  
  static /* void */ _OwnSelection(term, selections, count)
  register XtermWidget term;
  String *selections;
***************
*** 1120,1132 ****
--- 1280,1321 ----
  	  default:	       buffer = -1;
  	}
  	if (buffer >= 0)
+ #ifdef KANJI	/* ishisone */
+ 	{
+ 	    /* Since type of a CUT_BUFFER is STRING, KANJI and KANA
+ 	     * characters can't store in a CUT_BUFFER
+ 	     */
+ 	    int nw;
+ 	    int	nc = 0;
+ 	    wchar_t *p;
+ 	    char *s, *q;
+ 	    p = term->screen.selection;
+ 	    for (nw = term->screen.selection_length; nw > 0; nw--) {
+ 		if ((*p++ & 0x8080) == 0)
+ 		    nc++;
+ 	    }
+ 	    p = term->screen.selection;
+ 	    s = q = (char *)LOCAL_ALLOC(nc);
+ 	    for (nw = term->screen.selection_length; nw > 0; nw--, p++) {
+ 		if ((*p & 0x8080) == 0)
+ 		    *q++ = *p & 0x7f;
+ 	    }
+ 	    XStoreBytes( XtDisplay((Widget)term), s, nc, buffer);
+ 	    LOCAL_FREE(s);
+ 	}
+ #else
  	    XStoreBytes( XtDisplay((Widget)term), term->screen.selection,
  			 term->screen.selection_length, buffer );
+ #endif
  	else if (!replyToEmacs) {
  	    have_selection |=
  		XtOwnSelection( (Widget)term, atoms[i],
  			    term->screen.selection_time,
+ #ifdef KANJI
+ 			    ConvertSelection, LoseSelection, NULL);
+ #else
  			    ConvertSelection, LoseSelection, SelectionDone );
+ #endif
  	}
      }
      if (!replyToEmacs)
***************
*** 1179,1197 ****
--- 1368,1427 ----
  }
  
  /* copies text into line, preallocated */
+ #ifdef KANJI
+ wchar_t *SaveText(screen, row, scol, ecol, lp)
+ int row;
+ int scol, ecol;
+ TScreen *screen;
+ register wchar_t *lp;		/* pointer to where to put the text */
+ #else
  char *SaveText(screen, row, scol, ecol, lp)
  int row;
  int scol, ecol;
  TScreen *screen;
  register char *lp;		/* pointer to where to put the text */
+ #endif
  {
  	register int i = 0;
  	register char *ch = screen->buf[2 * (row + screen->topline)];
  	register int c;
+ #ifdef	KANJI	/* kato */
+ 	char *att = screen->buf[2 * (row + screen->topline) + 1];
+ #endif	/* KANJI */
  
  	if ((i = Length(screen, row, scol, ecol)) == 0) return(lp);
+ #ifdef	KANJI	/* kato */
+ 	/*
+ 	 * If the first byte is pointed to the 2nd byte of a Kanji char,
+ 	 * adjust to its 1st byte.
+ 	 */
+ 	if (att[scol] & KCS2) {
+ 		i++; scol--;
+ 	}
+ #endif	/* KANJI */
  	ecol = scol + i;
  	for (i = scol; i < ecol; i++) {
+ #ifdef KANJI
+ 		c = ch[i];
+ 		if (att[i] & KCS) {
+ 			/* KANJI */
+ 			c = (c << 8) | ch[i + 1] | 0x8080;
+ 			i++;
+ 		} else if (att[i] & KANACS) {
+ 			/* KANA */
+ 			c = c | 0x80;
+ 		} else if (c == 0) {
+ 			c = ' ';
+ 		} else if (c < ' ') {
+ 			if (c == '\036')
+ 				c = '#';
+ 			else
+ 				c += 0x5f;
+ 		} else if (c == 0x7f) {
+ 			c = 0x5f;
+ 		}
+ 		*lp++ = c;
+ #else
  		if ((c = ch[i]) == 0)
  			c = ' ';
  		else if(c < ' ') {
***************
*** 1202,1207 ****
--- 1432,1438 ----
  		} else if(c == 0x7f)
  			c = 0x5f;
  		*lp++ = c;
+ #endif
  	}
  	return(lp);
  }
***************
*** 1393,1399 ****
--- 1624,1635 ----
  	register int i;
  
  	if (*menu == NULL) {
+ #ifdef	KANJI	/* sano */
+ 		extern char menuname[]; /* defined in patchlevel.c */
+ 		if ((*menu = NewMenu(menuname)) == NULL)
+ #else	/* KANJI */
  		if ((*menu = NewMenu("xterm X11")) == NULL)
+ #endif	/* KANJI */
  			return(NULL);
  		for(cp = xtext ; *cp ; cp++)
  			AddMenuItem(*menu, *cp);