// HSP2.61
// WA_MACRO1.04 が必要
// HalfKana2FullKana p1     半角カナが含んだ文字列を全角カナに変換する
// FullKana2HalfKana p1     全角カナが含んだ文字列を半角カナに変換する
#include "wam/WinAPI.as"
#const global LCMAP_BYTEREV $00000800
#const global LCMAP_FULLWIDTH   $00800000
#const global LCMAP_HALFWIDTH   $00400000
#const global LCMAP_HIRAGANA    $00100000
#const global LCMAP_KATAKANA    $00200000
#const global LCMAP_LINGUISTIC_CASING   $01000000
#const global LCMAP_LOWERCASE   $00000100
#const global LCMAP_SIMPLIFIED_CHINESE  $02000000
#const global LCMAP_SORTKEY $00000400
#const global LCMAP_TRADITIONAL_CHINESE $04000000
#const global LCMAP_UPPERCASE   $00000200


#module "kana"
#deffunc HalfKana2FullKana_ val
    mref kana_, 24
    mref p_kana, 0
    strlen len, kana_
    sdim fullKana, 2
    LCMapString 0, LCMAP_FULLWIDTH | LCMAP_KATAKANA, p_kana, len, PTR(fullKana), 2
    kana_ = fullKana
return

#deffunc HalfKana2FullKana val
    mref txt, 24
    i = 0
    y = 0
    strlen len, txt
    sdim fullTxt, len + len
    sdim kana, 2
    repeat
        peek c1, txt, i
        peek c2, txt, i + 1
        if (c1 == 0x00) : break
        if ((c1 >= 0x81) && (c1 <= 0x9f)) || ((c1 >= 0xe0) && (c1 <= 0xfc)) {
            if ((c2 >= 0x40) && (c2 <= 0x7e)) || ((c2 >= 0x80) && (c2 <= 0xfc)) {
                poke fullTxt, y, c1
                poke fullTxt, y + 1, c2
                i += 2 : y += 2
                continue
            }
        }
        if (c1 >= 0xa1) && (c1 <= 0xdd) {
            poke kana, 0, c1
            i++
            if (c2 == 0xde) || (c2 == 0xdf) : poke kana, 1, c2 : i++
            HalfKana2FullKana_ kana
            wpoke fullTxt, y, kana
            y += 2
            continue
        }
        poke fullTxt, y, c1
        i++
        y++
    loop
    txt = fullTxt
return

#deffunc FullKana2HalfKana_ val
    mref kana_, 24
    mref p_kana, 0
    strlen len, kana_
    sdim halfKana, 2
    peek c2_, kana_, 1
    n = 1
    if (c2_ >= 0x4A) && (c2_ <= 0x61) {
        if (c2_ \ 2) : n = 2
    } else {
        if (c2 == 0x64) || (c2 == 0x66) || (c2 == 0x68) {
            n = 2
        } else {
            if (c2_ >= 0x6E) && (c2_ <= 0x7C) {
                if ((c2_ \ 3) != 2) : n = 2
            } else {
                if (c2_ == 0x94) : n = 2
            }
        }
    }
    LCMapString 0, LCMAP_HALFWIDTH | LCMAP_KATAKANA, p_kana, 2, PTR(halfKana), n
    kana_ = halfKana
return

#deffunc FullKana2HalfKana val
    mref txt, 24
    i = 0
    y = 0
    strlen len, txt
    sdim halfTxt, len + len
    sdim kana, 2
    repeat
        peek c1, txt, i
        peek c2, txt, i + 1
        if (c1 == 0x00) : break
        if ((c1 == 0x83) && (c2 >= 0x3f) && (c2 <= 0x9f)) || ((c1 == 0x81) && ((c2 == 0x41) || (c2 == 0x42) || (c2 == 0x45) || (c2 == 0x4A) || (c2 == 0x4B) || (c2 == 0x5B))) {
                poke kana, 0, c1
                poke kana, 1, c2
                i += 2
                FullKana2HalfKana_ kana
                strlen len, kana
                if (len == 1) {
                    poke halfTxt, y, kana
                    y++
                } else {
                    wpoke halfTxt, y, kana
                    y += 2
                }
                continue
        }
        if ((c1 >= 0x81) && (c1 <= 0x9f)) || ((c1 >= 0xe0) && (c1 <= 0xfc)) {
            if ((c2 >= 0x40) && (c2 <= 0x7e)) || ((c2 >= 0x80) && (c2 <= 0xfc)) {
                poke halfTxt, y, c1
                poke halfTxt, y + 1, c2
                i += 2 : y += 2
                continue
            }
        }
        poke halfTxt, y, c1
        i++
        y++
    loop
    txt = halfTxt
return

#global
s = "ｱｶｻﾀﾅﾊﾏﾔﾗﾜｦﾝｶﾞｻﾞﾀﾞﾊﾞﾊﾟｰ｡"
mes s
HalfKana2FullKana s
mes "半角カナ -> 全角カナ : " + s
FullKana2HalfKana s
mes "全角カナ -> 半角カナ : " + s
stop