--- src/LYCharUtils.c.orig	Thu Aug  6 21:28:22 1998
+++ src/LYCharUtils.c	Mon Aug 10 02:27:04 1998
@@ -73,6 +73,10 @@
     char *p = *str;
     char *q = NULL, *cp = NULL;
     int amps = 0, lts = 0, gts = 0;
+    enum _state
+        { S_text, S_esc, S_dollar, S_paren,
+          S_nonascii_text, S_dollar_paren } state = S_text;
+    int in_sjis = 0;
 
     if (p == NULL || *p == '\0')
 	return;
@@ -121,6 +125,86 @@
     if ((cp = q) == NULL)
 	outofmem(__FILE__, "LYEntify");
     for (p = *str; *p; p++) {
+	if (HTCJK != NOCJK) {
+	    switch(state) {
+	    case S_text:
+	        if (*p == '\033') {
+		    state = S_esc;
+		    *q++ = *p;
+		    continue;
+		}
+		break;
+ 
+	    case S_esc:
+		if (*p == '$') {
+		    state = S_dollar;
+		    *q++ = *p;
+		    continue;
+		} else if (*p == '(') {
+		    state = S_paren;
+		    *q++ = *p;
+		    continue;
+		} else {
+		    state = S_text;
+		    *q++ = *p;
+		    continue;
+		}
+
+	    case S_dollar:
+		if (*p == '@' || *p == 'B' || *p == 'A') {
+		    state = S_nonascii_text;
+		    *q++ = *p;
+		    continue;
+		} else if (*p == '(') {
+		    state = S_dollar_paren;
+		    *q++ = *p;
+		    continue;
+		} else {
+		    state = S_text;
+		    *q++ = *p;
+		    continue;
+		}
+
+	    case S_dollar_paren:
+		if (*p == 'C') {
+		    state = S_nonascii_text;
+		    *q++ = *p;
+		    continue;
+		} else {
+		    state = S_text;
+		    *q++ = *p;
+		    continue;
+		}
+
+	    case S_paren:
+		if (*p == 'B' || *p == 'J' || *p =='T') {
+		    state = S_text;
+		    *q++ = *p;
+		    continue;
+		} else if (*p == 'I') {
+		    state = S_nonascii_text;
+		    *q++ = *p;
+		    continue;
+		}
+
+	    case S_nonascii_text:
+		if (*p == '\033') 
+		    state = S_esc;
+		*q++ = *p;
+		continue;
+
+	    default:
+		break;
+	    }
+	    if (*(p+1) != '\0' &&
+	        (IS_EUC((unsigned char)*p, (unsigned char)*(p+1)) ||
+	         IS_SJIS((unsigned char)*p, (unsigned char)*(p+1), in_sjis) ||
+	         IS_BIG5((unsigned char)*p, (unsigned char)*(p+1)))) {
+		    *q++ = *p++;
+		    *q++ = *p;
+		    continue;
+	    }
+    	}
 	if (*p == '&') {
 	    *q++ = '&';
 	    *q++ = 'a';
@@ -141,6 +225,7 @@
 	    *q++ = *p;
 	}
     }
+    *q = '\0';
     StrAllocCopy(*str, cp);
     FREE(cp);
 }
