CVTKANA.C



/*--------------------------------------------------------------*/
/* PROGRAM-ID  : CVTKANAJ                                       */
/* REMARKS     : SBCS TO DBCS KATAKANA                          */
/* AUTHOR      : Y.IDE                                          */
/* DATE-WRITEN : 99/03/10                                       */
/* VERSION     : 01.00 ORIGINAL                                 */
/*--------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE        1
#define FALSE       0

/* 半角カタカナCCSID 290 */
#define ISKANA(A) ((A >=  65 && A <=  73) || (A ==  88) || \
                   (A >=  81 && A <=  86) || (A >= 129 && A <= 138) ||\
                   (A >= 140 && A <= 154) || (A >= 157 && A <= 159) ||\
                   (A >= 162 && A <= 170) || (A >= 172 && A <= 175) ||\
                   (A >= 186 && A <= 191) )
/* EBCDIC ゜゛*/
#define EBCMARU  191
#define EBCDAKU  190
#define DBCSPLUS  67  /* 0x43 */
#define SO        14  /* 0E */
#define SI        15  /* 0F */

/*゜゛が可能な文字*/
 /* ハ行157-163 */
 /* カサタ行134-149 */
 /* ウ131 */
#define ISMARU(A)   (A >= 157 && A <= 163)
#define ISNIGORI(A) ((A >= 134 && A <= 149) || (A >= 157 && A <= 163) \
                     || (A == 131))

char ntbl[33]={'\xd4','\x40','\x40','\xc0','\xc1','\xc2','\xc3','\xc4',
               '\x40','\xc5','\xc6','\xc7','\xc8','\xc9','\xca','\xcb',
               '\xcc','\xcd','\xce','\x40','\x40','\x40','\x40','\x40',
               '\x40','\x40','\xcf','\xd0','\xd1','\x40','\x40','\xd2',
               '\xd3'};
char mtbl[7] = {'\xd5','\xd6','\xd7','\x40','\x40','\xd8','\xd9'};

void HanToZen(char *,char *,int *,int *);

void main(int argc, char *argv[]){
  char sKana[1024];
  char dKana[1024];
  int  inbyte  = 0;
  int  outbyte = 0;

  inbyte = atoi(argv[2]);
  memcpy(sKana,argv[1],inbyte);

  memset(&dKana , '\x40', 1024);

  HanToZen((char *)&sKana,(char *)&dKana,&inbyte,&outbyte);

  memcpy(argv[3],dKana,outbyte);
  sprintf(argv[4],"%d",outbyte);

}

/*----------------------------------------------------------------*/
 void HanToZen(char *in,char *out,int *inbyte, int *outbyte)
/*----------------------------------------------------------------*/
 {
  int maru = FALSE,nigori = FALSE;
  int sbcsmode = TRUE, kanamode = FALSE;
  int i=0,o=0;

  while(1){
    if(i >= *inbyte){
      if (kanamode){
        out[o]= SI;
        o++;
      }
    break;
    }
    maru = FALSE;
    nigori = FALSE;
    /* 漢字モード?  */
    if(in[i] == SO){
      if(kanamode) i++;
      sbcsmode = FALSE;
    }

    if(sbcsmode == FALSE){

      if (in[i] == SI){
        sbcsmode = TRUE;
        if ((ISKANA(in[i+1])) || (kanamode)) {
          kanamode = TRUE;
        /*カタカナモードでないかつ次がカタカナでない*/
        } else {
          out[o] = in[i];
          o++;
        }
      } else {
        out[o] = in[i];
        o++;
      }

    } else {
      /*カタカナモード? */
      if (kanamode){
        if (ISKANA(in[i])){             /* カタカナ判別*/
          if (in[i+1] == EBCDAKU) {               /*濁点判別*/
            if (ISNIGORI(in[i])) nigori = TRUE;
          } else if (in[i+1] == EBCMARU) {        /*まる判別*/
            if (ISMARU(in[i]))   maru = TRUE;
          }
          /*ダブルバイトに変換*/
          out[o] = DBCSPLUS;
          o++;
          out[o] = in[i];
          /*「゛」変換*/
          if (nigori){
          out[o] = ntbl[(in[i]-131)];
          i++;
          }
          /*「゜」変換*/
          if (maru){
          out[o] = mtbl[(in[i])-157];
          i++;
          }
          o++;
        } else {
          out[o] = SI;      /* 0F出力*/
          o++;
          out[o] = in[i];   /*文字出力*/
          o++;
          kanamode = FALSE; /* カタカナモードオフ*/
        }
      } else {
      /* 最初のカタカナ?*/
        if (ISKANA(in[i])){
          out[o] = SO;    /* 0E出力*/
          o++;
          kanamode = TRUE;  /*カタカナモードオン*/

          /*濁点判別*/
          if (in[i+1] == EBCDAKU) {
            if (ISNIGORI(in[i])) nigori = TRUE;
          /*まる判別*/
          } else if (in[i+1] == EBCMARU) {
            if (ISMARU(in[i]))   maru = TRUE;
          }
          /*ダブルバイトに変換*/
          out[o] = DBCSPLUS;
          o++;
          out[o] = in[i];
          /*「゛」変換*/
          if (nigori){
          out[o] = ntbl[(in[i]-131)];
          i++;
          }
          /*「゜」変換*/
          if (maru){
          out[o] = mtbl[(in[i]-157)];
          i++;
          }
          o++;
        } else {
          out[o] = in[i];
          o++;
        }
      }
    }
    i++;
  }

  *outbyte = o;
}


[cvtkanaj.html]