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] |