home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
comm
/
ykh121.zip
/
YKHSRC.ZIP
/
ROMKAN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-04
|
14KB
|
435 lines
#include <stdlib.h>
#define KANA_00000 0
#define KANA_A 2
#define KANA_I 4
#define KANA_U 6
#define KANA_E 8
#define KANA_O 10
#define KANA_KA 11
#define KANA_KI 13
#define KANA_KU 15
#define KANA_KE 17
#define KANA_KO 19
#define KANA_SA 21
#define KANA_SHI 23
#define KANA_SU 25
#define KANA_SE 27
#define KANA_SO 29
#define KANA_TA 31
#define KANA_CHI 33
#define KANA_TSU 36
#define KANA_TE 38
#define KANA_TO 40
#define KANA_NA 42
#define KANA_NI 43
#define KANA_NU 44
#define KANA_NE 45
#define KANA_NO 46
#define KANA_HA 47
#define KANA_HI 50
#define KANA_HU 53
#define KANA_HE 56
#define KANA_HO 59
#define KANA_MA 62
#define KANA_MI 63
#define KANA_MU 64
#define KANA_ME 65
#define KANA_MO 66
#define KANA_YA 68
#define KANA_YU 70
#define KANA_YO 72
#define KANA_RA 73
#define KANA_RI 74
#define KANA_RU 75
#define KANA_RE 76
#define KANA_RO 77
#define KANA_WA 79
#define KANA_WO 82
#define KANA_N 83
#define KANA_TTSU 35
#define KANA_YYA 67
#define KANA_YYU 69
#define KANA_YYO 71
#define KANA_YI 80
#define KANA_YE 81
#define KANA_HYPE 87
#define KANA_VU 84
#define KANA_ATOM1 9
#define KANA_ATOM2 71
#define KANA_ATOM3 52
#define KANA_ATOM4 17
#define KATA_ATOM2 16
#define KATA_ATOM3 6
#define KANA_ATOMS KANA_ATOM1+KANA_ATOM2+KANA_ATOM3+KANA_ATOM4+KATA_ATOM2+KATA_ATOM3
#define HIRAGANA 1
#define KATAKANA 2
typedef struct {
unsigned char rom[4];
unsigned char kan[3];
} rtok;
rtok rk[KANA_ATOMS] = {
{'a',000,000,000,KANA_A ,KANA_00000,KANA_00000},
{'i',000,000,000,KANA_I ,KANA_00000,KANA_00000},
{'u',000,000,000,KANA_U ,KANA_00000,KANA_00000},
{'e',000,000,000,KANA_E ,KANA_00000,KANA_00000},
{'o',000,000,000,KANA_O ,KANA_00000,KANA_00000},
{'n',000,000,000,KANA_N ,KANA_00000,KANA_00000},
{'m',000,000,000,KANA_N ,KANA_00000,KANA_00000},
{'-',000,000,000,KANA_HYPE ,KANA_00000,KANA_00000},
{'\'',000,000,00,KANA_00000,KANA_00000,KANA_00000},
{'k','a',000,000,KANA_KA ,KANA_00000,KANA_00000},
{'k','i',000,000,KANA_KI ,KANA_00000,KANA_00000},
{'k','u',000,000,KANA_KU ,KANA_00000,KANA_00000},
{'k','e',000,000,KANA_KE ,KANA_00000,KANA_00000},
{'k','o',000,000,KANA_KO ,KANA_00000,KANA_00000},
{'g','a',000,000,KANA_KA+1 ,KANA_00000,KANA_00000},
{'g','i',000,000,KANA_KI+1 ,KANA_00000,KANA_00000},
{'g','u',000,000,KANA_KU+1 ,KANA_00000,KANA_00000},
{'g','e',000,000,KANA_KE+1 ,KANA_00000,KANA_00000},
{'g','o',000,000,KANA_KO+1 ,KANA_00000,KANA_00000},
{'s','a',000,000,KANA_SA ,KANA_00000,KANA_00000},
{'s','u',000,000,KANA_SU ,KANA_00000,KANA_00000},
{'s','e',000,000,KANA_SE ,KANA_00000,KANA_00000},
{'s','o',000,000,KANA_SO ,KANA_00000,KANA_00000},
{'z','a',000,000,KANA_SA+1 ,KANA_00000,KANA_00000},
{'j','i',000,000,KANA_SHI+1,KANA_00000,KANA_00000},
{'z','u',000,000,KANA_SU+1 ,KANA_00000,KANA_00000},
{'z','e',000,000,KANA_SE+1 ,KANA_00000,KANA_00000},
{'z','o',000,000,KANA_SO+1 ,KANA_00000,KANA_00000},
{'t','a',000,000,KANA_TA ,KANA_00000,KANA_00000},
{'t','e',000,000,KANA_TE ,KANA_00000,KANA_00000},
{'t','o',000,000,KANA_TO ,KANA_00000,KANA_00000},
{'d','a',000,000,KANA_TA+1 ,KANA_00000,KANA_00000},
{'d','e',000,000,KANA_TE+1 ,KANA_00000,KANA_00000},
{'d','o',000,000,KANA_TO+1 ,KANA_00000,KANA_00000},
{'n','a',000,000,KANA_NA ,KANA_00000,KANA_00000},
{'n','i',000,000,KANA_NI ,KANA_00000,KANA_00000},
{'n','u',000,000,KANA_NU ,KANA_00000,KANA_00000},
{'n','e',000,000,KANA_NE ,KANA_00000,KANA_00000},
{'n','o',000,000,KANA_NO ,KANA_00000,KANA_00000},
{'h','a',000,000,KANA_HA ,KANA_00000,KANA_00000},
{'h','i',000,000,KANA_HI ,KANA_00000,KANA_00000},
{'f','u',000,000,KANA_HU ,KANA_00000,KANA_00000},
{'h','u',000,000,KANA_HU ,KANA_00000,KANA_00000},
{'h','e',000,000,KANA_HE ,KANA_00000,KANA_00000},
{'h','o',000,000,KANA_HO ,KANA_00000,KANA_00000},
{'b','a',000,000,KANA_HA+1 ,KANA_00000,KANA_00000},
{'b','i',000,000,KANA_HI+1 ,KANA_00000,KANA_00000},
{'b','u',000,000,KANA_HU+1 ,KANA_00000,KANA_00000},
{'b','e',000,000,KANA_HE+1 ,KANA_00000,KANA_00000},
{'b','o',000,000,KANA_HO+1 ,KANA_00000,KANA_00000},
{'p','a',000,000,KANA_HA+2 ,KANA_00000,KANA_00000},
{'p','i',000,000,KANA_HI+2 ,KANA_00000,KANA_00000},
{'p','u',000,000,KANA_HU+2 ,KANA_00000,KANA_00000},
{'p','e',000,000,KANA_HE+2 ,KANA_00000,KANA_00000},
{'p','o',000,000,KANA_HO+2 ,KANA_00000,KANA_00000},
{'m','a',000,000,KANA_MA ,KANA_00000,KANA_00000},
{'m','i',000,000,KANA_MI ,KANA_00000,KANA_00000},
{'m','u',000,000,KANA_MU ,KANA_00000,KANA_00000},
{'m','e',000,000,KANA_ME ,KANA_00000,KANA_00000},
{'m','o',000,000,KANA_MO ,KANA_00000,KANA_00000},
{'y','a',000,000,KANA_YA ,KANA_00000,KANA_00000},
{'y','i',000,000,KANA_YI ,KANA_00000,KANA_00000},
{'y','u',000,000,KANA_YU ,KANA_00000,KANA_00000},
{'y','e',000,000,KANA_YE ,KANA_00000,KANA_00000},
{'y','o',000,000,KANA_YO ,KANA_00000,KANA_00000},
{'r','a',000,000,KANA_RA ,KANA_00000,KANA_00000},
{'r','i',000,000,KANA_RI ,KANA_00000,KANA_00000},
{'r','u',000,000,KANA_RU ,KANA_00000,KANA_00000},
{'r','e',000,000,KANA_RE ,KANA_00000,KANA_00000},
{'r','o',000,000,KANA_RO ,KANA_00000,KANA_00000},
{'w','a',000,000,KANA_WA ,KANA_00000,KANA_00000},
{'w','o',000,000,KANA_WO ,KANA_00000,KANA_00000},
{'j','a',000,000,KANA_SHI+1,KANA_YYA ,KANA_00000},
{'j','u',000,000,KANA_SHI+1,KANA_YYU ,KANA_00000},
{'j','o',000,000,KANA_SHI+1,KANA_YYO ,KANA_00000},
{'a','\'',000,000,KANA_A-1 ,KANA_00000,KANA_00000},
{'i','\'',000,000,KANA_I-1 ,KANA_00000,KANA_00000},
{'u','\'',000,000,KANA_U-1 ,KANA_00000,KANA_00000},
{'e','\'',000,000,KANA_E-1 ,KANA_00000,KANA_00000},
{'o','\'',000,000,KANA_O-1 ,KANA_00000,KANA_00000},
{'s','h','i',000,KANA_SHI ,KANA_00000,KANA_00000},
{'c','h','i',000,KANA_CHI ,KANA_00000,KANA_00000},
{'t','s','u',000,KANA_TSU ,KANA_00000,KANA_00000},
{'k','k','a',000,KANA_TTSU ,KANA_KA ,KANA_00000},
{'k','k','i',000,KANA_TTSU ,KANA_KI ,KANA_00000},
{'k','k','u',000,KANA_TTSU ,KANA_KU ,KANA_00000},
{'k','k','e',000,KANA_TTSU ,KANA_KE ,KANA_00000},
{'k','k','o',000,KANA_TTSU ,KANA_KO ,KANA_00000},
{'s','s','a',000,KANA_TTSU ,KANA_SA ,KANA_00000},
{'s','s','u',000,KANA_TTSU ,KANA_SU ,KANA_00000},
{'s','s','e',000,KANA_TTSU ,KANA_SE ,KANA_00000},
{'s','s','o',000,KANA_TTSU ,KANA_SO ,KANA_00000},
{'t','t','a',000,KANA_TTSU ,KANA_TA ,KANA_00000},
{'t','t','e',000,KANA_TTSU ,KANA_TE ,KANA_00000},
{'t','t','o',000,KANA_TTSU ,KANA_TO ,KANA_00000},
{'p','p','a',000,KANA_TTSU ,KANA_HA+2 ,KANA_00000},
{'p','p','i',000,KANA_TTSU ,KANA_HI+2 ,KANA_00000},
{'p','p','u',000,KANA_TTSU ,KANA_HU+2 ,KANA_00000},
{'p','p','e',000,KANA_TTSU ,KANA_HE+2 ,KANA_00000},
{'p','p','o',000,KANA_TTSU ,KANA_HO+2 ,KANA_00000},
{'k','y','a',000,KANA_KI ,KANA_YYA ,KANA_00000},
{'k','y','u',000,KANA_KI ,KANA_YYU ,KANA_00000},
{'k','y','o',000,KANA_KI ,KANA_YYO ,KANA_00000},
{'g','y','a',000,KANA_KI+1 ,KANA_YYA ,KANA_00000},
{'g','y','u',000,KANA_KI+1 ,KANA_YYU ,KANA_00000},
{'g','y','o',000,KANA_KI+1 ,KANA_YYO ,KANA_00000},
{'c','h','a',000,KANA_CHI ,KANA_YYA ,KANA_00000},
{'c','h','u',000,KANA_CHI ,KANA_YYU ,KANA_00000},
{'c','h','o',000,KANA_CHI ,KANA_YYO ,KANA_00000},
{'s','h','a',000,KANA_SHI ,KANA_YYA ,KANA_00000},
{'s','h','u',000,KANA_SHI ,KANA_YYU ,KANA_00000},
{'s','h','o',000,KANA_SHI ,KANA_YYO ,KANA_00000},
{'t','s','a',000,KANA_TSU ,KANA_YYA ,KANA_00000},
{'t','s','o',000,KANA_TSU ,KANA_YYO ,KANA_00000},
{'n','y','a',000,KANA_NI ,KANA_YYA ,KANA_00000},
{'n','y','u',000,KANA_NI ,KANA_YYU ,KANA_00000},
{'n','y','o',000,KANA_NI ,KANA_YYO ,KANA_00000},
{'h','y','a',000,KANA_HI ,KANA_YYA ,KANA_00000},
{'h','y','u',000,KANA_HI ,KANA_YYU ,KANA_00000},
{'h','y','o',000,KANA_HI ,KANA_YYO ,KANA_00000},
{'b','y','a',000,KANA_HI+1 ,KANA_YYA ,KANA_00000},
{'b','y','u',000,KANA_HI+1 ,KANA_YYU ,KANA_00000},
{'b','y','o',000,KANA_HI+1 ,KANA_YYO ,KANA_00000},
{'p','y','a',000,KANA_HI+2 ,KANA_YYA ,KANA_00000},
{'p','y','u',000,KANA_HI+2 ,KANA_YYU ,KANA_00000},
{'p','y','o',000,KANA_HI+2 ,KANA_YYO ,KANA_00000},
{'m','y','a',000,KANA_MI ,KANA_YYA ,KANA_00000},
{'m','y','u',000,KANA_MI ,KANA_YYU ,KANA_00000},
{'m','y','o',000,KANA_MI ,KANA_YYO ,KANA_00000},
{'r','y','a',000,KANA_RI ,KANA_YYA ,KANA_00000},
{'r','y','u',000,KANA_RI ,KANA_YYU ,KANA_00000},
{'r','y','o',000,KANA_RI ,KANA_YYO ,KANA_00000},
{'k','k','y','a',KANA_TTSU ,KANA_KI ,KANA_YYA },
{'k','k','y','u',KANA_TTSU ,KANA_KI ,KANA_YYU },
{'k','k','y','o',KANA_TTSU ,KANA_KI ,KANA_YYO },
{'s','s','h','a',KANA_TTSU ,KANA_SHI ,KANA_YYA },
{'s','s','h','i',KANA_TTSU ,KANA_SHI ,KANA_00000},
{'s','s','h','u',KANA_TTSU ,KANA_SHI ,KANA_YYU },
{'s','s','h','o',KANA_TTSU ,KANA_SHI ,KANA_YYO },
{'t','c','h','a',KANA_TTSU ,KANA_CHI ,KANA_YYA },
{'t','c','h','i',KANA_TTSU ,KANA_CHI ,KANA_00000},
{'t','c','h','u',KANA_TTSU ,KANA_CHI ,KANA_YYU },
{'t','c','h','o',KANA_TTSU ,KANA_CHI ,KANA_YYO },
{'t','t','s','a',KANA_TTSU ,KANA_TSU ,KANA_YYA },
{'t','t','s','u',KANA_TTSU ,KANA_TSU ,KANA_00000},
{'t','t','s','o',KANA_TTSU ,KANA_TSU ,KANA_YYO },
{'p','p','y','a',KANA_TTSU ,KANA_HI+2 ,KANA_YYA },
{'p','p','y','u',KANA_TTSU ,KANA_HI+2 ,KANA_YYU },
{'p','p','y','o',KANA_TTSU ,KANA_HI+2 ,KANA_YYO },
/* the following 16 + 6 are only written with katakana */
{'j','e',000,000,KANA_SHI+1,KANA_E-1 ,KANA_00000},
{'w','i',000,000,KANA_U ,KANA_I-1 ,KANA_00000},
{'w','e',000,000,KANA_U ,KANA_E-1 ,KANA_00000},
{'w','o',000,000,KANA_U ,KANA_O-1 ,KANA_00000},
{'t','i',000,000,KANA_TE ,KANA_I-1 ,KANA_00000},
{'f','a',000,000,KANA_HU ,KANA_A-1 ,KANA_00000},
{'f','i',000,000,KANA_HU ,KANA_I-1 ,KANA_00000},
{'f','e',000,000,KANA_HU ,KANA_E-1 ,KANA_00000},
{'f','o',000,000,KANA_HU ,KANA_O-1 ,KANA_00000},
{'d','i',000,000,KANA_TE+1 ,KANA_I-1 ,KANA_00000},
{'d','u',000,000,KANA_TE+1 ,KANA_YYU ,KANA_00000},
{'v','a',000,000,KANA_VU ,KANA_A-1 ,KANA_00000},
{'v','i',000,000,KANA_VU ,KANA_I-1 ,KANA_00000},
{'v','u',000,000,KANA_VU ,KANA_U-1 ,KANA_00000},
{'v','e',000,000,KANA_VU ,KANA_E-1 ,KANA_00000},
{'v','o',000,000,KANA_VU ,KANA_O-1 ,KANA_00000},
{'s','h','e',000,KANA_SHI ,KANA_E-1 ,KANA_00000},
{'c','h','e',000,KANA_CHI ,KANA_E-1 ,KANA_00000},
{'k','w','a',000,KANA_KU ,KANA_A-1 ,KANA_00000},
{'t','s','a',000,KANA_TSU ,KANA_A-1 ,KANA_00000},
{'t','s','e',000,KANA_TSU ,KANA_E-1 ,KANA_00000},
{'t','s','o',000,KANA_TSU ,KANA_O-1 ,KANA_00000}
};
char* romajitokana(unsigned char* dest, unsigned char* src, int type)
{
int i,j;
int best;
int romnum;
*dest=0;
for (;;)
{
best=-1;
romnum=-1;
if (strlen(src)>3)
{
for (j=KANA_ATOM1+KANA_ATOM2+KANA_ATOM3; j<KANA_ATOM1+KANA_ATOM2+KANA_ATOM3+KANA_ATOM4; j++)
if ( (rk[j].rom[0]==*(src )) &&
(rk[j].rom[1]==*(src+1)) &&
(rk[j].rom[2]==*(src+2)) &&
(rk[j].rom[3]==*(src+3)) )
{
best=j;
romnum=4;
}
}
if ( (type==KATAKANA) && (best==-1) && (strlen(src)>2) )
{
for (j=KANA_ATOM1+KANA_ATOM2+KANA_ATOM3+KANA_ATOM4+KATA_ATOM2; j<KANA_ATOM1+KANA_ATOM2+KANA_ATOM3+KANA_ATOM4+KATA_ATOM2+KATA_ATOM3; j++)
if ( (rk[j].rom[0]==*(src )) &&
(rk[j].rom[1]==*(src+1)) &&
(rk[j].rom[2]==*(src+2)) )
{
best=j;
romnum=3;
}
}
if ( (best==-1) && (strlen(src)>2) )
{
for (j=KANA_ATOM1+KANA_ATOM2; j<KANA_ATOM1+KANA_ATOM2+KANA_ATOM3; j++)
if ( (rk[j].rom[0]==*(src )) &&
(rk[j].rom[1]==*(src+1)) &&
(rk[j].rom[2]==*(src+2)) )
{
best=j;
romnum=3;
}
}
if ( (type==KATAKANA) && (best==-1) && (strlen(src)>1) )
{
for (j=KANA_ATOM1+KANA_ATOM2+KANA_ATOM3+KANA_ATOM4; j<KANA_ATOM1+KANA_ATOM2+KANA_ATOM3+KANA_ATOM4+KATA_ATOM2; j++)
if ( (rk[j].rom[0]==*(src )) &&
(rk[j].rom[1]==*(src+1)) )
{
best=j;
romnum=2;
}
}
if ( (best==-1) && (strlen(src)>1) )
{
for (j=KANA_ATOM1; j<KANA_ATOM1+KANA_ATOM2; j++)
if ( (rk[j].rom[0]==*(src )) &&
(rk[j].rom[1]==*(src+1)) )
{
best=j;
romnum=2;
}
}
if ( (best==-1) && (*src) )
{
for (j=0; j<KANA_ATOM1; j++)
if (rk[j].rom[0]==*src)
{
best=j;
romnum=1;
}
}
if (!*src)
return dest;
switch (best)
{
case -1:
*dest++=*src++;
*dest=0;
break;
default:
src+=romnum;
for (i=0; i<3; i++)
if (rk[best].kan[i])
{
if (type==HIRAGANA)
*dest++='$'|0x80;
else
*dest++='%'|0x80;
*dest++=(rk[best].kan[i]+'!'-1)|0x80;
*dest=0;
}
break;
}
}
}
char* romajitohiragana(unsigned char* dest, unsigned char* src)
{
char *local;
char *temp;
if ((local=malloc(strlen(src)+1))==NULL)
return 0;
strcpy(local,src);
temp=local;
while (*temp)
{
if (*temp=='l')
*temp='r';
temp++;
}
temp=romajitokana(dest,local,HIRAGANA);
free(local);
return temp;
}
char* romajitokatakana(unsigned char* dest, unsigned char* src)
{
int i;
char *local;
char *temp;
if ((local=malloc(strlen(src)+1))==NULL)
return 0;
strcpy(local,src);
temp=local;
while (*temp)
{
if (*temp=='l')
*temp='r';
temp++;
}
if (strlen(local)>1)
for (i=0; i<strlen(local)-1; i++)
switch (local[i])
{
case 'a':
case 'i':
case 'u':
case 'e':
case 'o':
if (local[i+1]==local[i])
{
temp=local+i+1;
while (*temp==local[i])
*temp++='-';
}
}
temp=romajitokana(dest,local,KATAKANA);
free(local);
return temp;
}