summaryrefslogtreecommitdiff
path: root/language/japanese/ptex/kanji.c
diff options
context:
space:
mode:
Diffstat (limited to 'language/japanese/ptex/kanji.c')
-rw-r--r--language/japanese/ptex/kanji.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/language/japanese/ptex/kanji.c b/language/japanese/ptex/kanji.c
new file mode 100644
index 0000000000..c14562fb44
--- /dev/null
+++ b/language/japanese/ptex/kanji.c
@@ -0,0 +1,233 @@
+/*
+ * KANJI Code conversion routines.
+ */
+
+#define KANJI_C
+#include "kanji.h"
+
+boolean iskanji1(c)
+ unsigned char c;
+{
+ c &= 0xff;
+ if (prockanjicode == SJIS)
+ return((c>=0x81 && c<=0x9f) || (c>=0xe0 && c<=0xfc));
+ else
+ return(c>=0xa1 && c<=0xfe);
+}
+
+boolean iskanji2(c)
+ unsigned char c;
+{
+ c &= 0xff;
+ if (prockanjicode == SJIS)
+ return(c>=0x40 && c<=0xfc && c!=0x7f);
+ else
+ return(c>=0xa1 && c<=0xfe);
+}
+
+boolean checkkanji(c)
+ integer c;
+{
+ if(c<0 || c>256)
+ return(iskanji1(c>>8) && iskanji2(c & 0xff));
+ return(-1);
+}
+
+#ifdef OLDSTYLE
+integer calcpos(c)
+{
+ register int c1, c2;
+
+ if(c<256) return(c<<1);
+ c1 = c>>8;
+ c2 = c & 0xff;
+ if(c1) {
+ if (prockanjicode == SJIS)
+ return((c2+(c2<<(c1-0x81)) & 0xff)<<1);
+ else
+ return((c2+(c2<<(c1-0xa1)) & 0xff)<<1);
+ } else
+ return(((c2+c2+1) & 0xff)<<1);
+}
+#else /* OLDSTYLE */
+integer calcpos(c)
+ integer c;
+{
+ register unsigned char c1, c2;
+ integer ret;
+
+ if(c>=0 && c<=255) return(c);
+ c1 = (c >> 8) & 0xff;
+ c2 = c & 0xff;
+ if(iskanji1(c1)) {
+ if (prockanjicode == SJIS) {
+ c1 = ((c1 - 0x81) % 4) * 64; /* c1 = 0, 64, 128, 192 */
+ c2 = c2 % 64; /* c2 = 0..63 */
+ } else {
+ c1 = ((c1 - 0xa1) % 4) * 64; /* c1 = 0, 64, 128, 192 */
+ c2 = c2 % 64; /* c2 = 0..63 */
+ }
+ return(c1 + c2); /* ret = 0..255 */
+ } else
+ return(c2);
+}
+#endif /* OLDSTYLE */
+
+/*
+ * EUC to JIS X0208 code conversion
+ */
+integer EUCtoJIS(kcode)
+ integer kcode;
+{
+ return(kcode & 0x7f7f);
+}
+
+/*
+ * JIS X0208 to EUC code conversion
+ */
+integer JIStoEUC(kcode)
+ integer kcode;
+{
+ return(kcode | 0x8080);
+}
+
+/*
+ * SJIStoJIS : Shift JIS to JIS Kanji code conversion
+ */
+integer SJIStoJIS(kcode)
+ integer kcode;
+{
+ register short byte1, byte2;
+
+ byte1 = (kcode>>8) & 0xff;
+ byte2 = kcode & 0xff;
+ byte1 -= ( byte1>=0xa0 ) ? 0xc1 : 0x81;
+ kcode = ((byte1<<1) + 0x21)<<8;
+ if( byte2>=0x9f ) {
+ kcode += 0x0100;
+ kcode |= (byte2 - 0x7e) & 0xff;
+ } else {
+ kcode |= (byte2 - ((byte2<=0x7e) ? 0x1f : 0x20 )) & 0xff;
+ }
+ return(kcode);
+}
+
+/*
+ * JIS X0208 to Shift JIS code conversion
+ */
+integer JIStoSJIS(kcode)
+ integer kcode;
+{
+ register integer high, low;
+ register integer nh, nl;
+
+ high = (kcode>>8) & 0xff;
+ low = kcode & 0xff;
+ nh = ((high-0x21)>>1) + 0x81;
+ if (nh>0x9f) nh += 0x40;
+ if (high & 1) {
+ nl = low + 0x1f;
+ if (low>0x5f) nl++;
+ } else
+ nl = low + 0x7e;
+ if(iskanji1(nh) && iskanji2(nl))
+ return((nh<<8) | nl);
+ else
+ return(0x813f);
+}
+
+/*
+ * Shift JIS to EUC Kanji code conversion
+ */
+integer SJIStoEUC(kcode)
+ integer kcode;
+{
+ return(SJIStoJIS(kcode) | 0x8080 );
+}
+
+/*
+ * EUC to SJIS Kanji code conversion
+ */
+integer EUCtoSJIS(kcode)
+ integer kcode;
+{
+ return(JIStoSJIS(kcode & 0x7f7f));
+}
+
+/*
+ * KUTEN to JIS kanji code conversion
+ */
+integer kuten2jis(kcode)
+ integer kcode;
+{
+ register short byte1, byte2;
+
+ byte1 = (kcode>>8) & 0xff;
+ byte2 = kcode & 0xff;
+
+ /* in case of undefined in kuten code table */
+ if (byte1 == 0 || byte1 > 95 || byte2 == 0 || byte2 > 95)
+ return(-1);
+
+ byte1 += 0x20;
+ byte2 += 0x20;
+
+ return (byte1<<8 | byte2);
+}
+
+/*
+ * KUTEN to EUC Kanji code conversion
+ */
+integer KUTENtoEUC(kcode)
+ integer kcode;
+{
+ return(JIStoEUC(kuten2jis(kcode)));
+}
+
+/*
+ * KUTENtoSJIS Kanji code conversion
+ */
+integer KUTENtoSJIS(kcode)
+ integer kcode;
+{
+ return(JIStoSJIS(kuten2jis(kcode)));
+}
+
+void putc2(c, fp)
+ unsigned char c;
+ FILE *fp;
+{
+ static integer kanji[NOFILE];
+ static unsigned char c1[NOFILE];
+ integer jc;
+ register fd;
+
+ fd = fileno(fp);
+ if (kanji[fd] == 1) {
+ jc = (c1[fd] << 8) | c;
+ if (prockanjicode == JIS) jc = EUCtoJIS(jc);
+ (void) putc(jc >> 8, fp);
+ (void) putc(jc & 0xff, fp);
+ kanji[fd] = 2;
+ } else if (iskanji1(c)) {
+ if (kanji[fd] == 0) {
+ if (prockanjicode == JIS) {
+ (void) putc('\033', fp);
+ (void) putc('$', fp);
+ (void) putc('B', fp);
+ }
+ }
+ c1[fd] = c;
+ kanji[fd] = 1;
+ } else {
+ if (kanji[fd] == 2) {
+ if (prockanjicode == JIS) {
+ (void) putc('\033', fp);
+ (void) putc('(', fp);
+ (void) putc('B', fp);
+ }
+ kanji[fd] = 0;
+ }
+ (void) putc(c, fp);
+ }
+}