Logo Search packages:      
Sourcecode: ptex-bin version File versions  Download package

kanji.c

/*
 *  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);
      }
}

Generated by  Doxygen 1.6.0   Back to index