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