// HSP2.61

// uni2utf8 p1, p2
// p1=変数  : 変換先
// p2=変数  : UTF-8に変換するUnicodeの文字列
//
// utf82uni p1, p2
// p1=変数  : 変換先
// p2=変数  : Unicodeに変換するUTF-8の文字列
//
#module "utf8"
#deffunc uni2utf8 val, val
mref out, 24
mref in, 25
mref p_str, 1

i = 0
dim c, 1
repeat
    c = 0
    ll_peek c, p_str + i, 2
    if (c == 0) : break
    if (c >= 0x00) && (c <= 0x7f) {
        poke out, cnt, c
        i += 2
        continue
    }
    if (c >= 0x80) && (c <= 0x7ff) {
        i1 = (c >> 6) + 0xc0
        i2 = (c & 0x3f) + 0x80
        poke out, cnt, i1
        poke out, cnt + 1, i2
        i += 2
        continue cnt + 2
    }
    if (c >= 0x800) && (c <= 0xffff) {
        i1 = (c >> 12) + 0xe0
        i2 = ((c >> 6) & 0x3f) + 0x80
        i3 = (c & 0x3f) + 0x80
        poke out, cnt, i1
        poke out, cnt + 1, i2
        poke out, cnt + 2, i3
        i += 2
        continue cnt + 3
    }
    dim c, 1
    ll_peek c, p_str + i, 3
    if (c >= 0x10000) && (c <= 0x1fffff) {
        i1 = (c >> 18) + 0xf0
        i2 = ((c >> 12) & 0x3f) + 0x80
        i3 = ((c >> 6) & 0x3f) + 0x80
        i4 = (c & 0x3f) + 0x80
        poke out, cnt, i1
        poke out, cnt + 1, i2
        poke out, cnt + 2, i3
        poke out, cnt + 3, i4
        i += 3
        continue cnt + 4
    }
    poke out, cnt, c
    i++
loop
return
#deffunc utf82uni val,val
mref out, 24
mref in, 25
mref p_str, 1

i = 0
repeat
    dim c1, 1 : peek c1, in, i
    dim c2, 1 : peek c2, in, i + 1
    dim c3, 1 : peek c3, in, i + 2
    dim c4, 1 : peek c4, in, i + 3
    if (c1 == 0) : break
    if (c1 >= 0x00) && (c1 <= 0x7f) {
        poke out, cnt, c1
        poke out, cnt + 1, 0x00
        i += 1
        continue cnt + 2
    }
    if (c1 >= 0xc2) && (c1 <= 0xdf) {
        if (c2 >= 0x80) && (c2 <= 0xbf) {
            i1 = (c1 - 0xc0) << 6
            i2 = c2 - 0x80
            wpoke out, cnt, i1 + i2
            i += 2
            continue cnt + 2
        }
    }
    if (c1 >= 0xe0) && (c1 <= 0xef) {
        if (c2 >= 0x80) && (c2 <= 0xbf) {
            if (c3 >= 0x80) && (c3 <= 0xbf) {
                i1 = (c1 - 0xe0) << 12
                i2 = (c2 - 0x80) << 6
                i3 = c3 - 0x80
                wpoke out, cnt, i1 + i2 + i3
                i += 3
                continue cnt + 2
            }
        }
    }
    if (c1 >= 0xf0) && (c1 <= 0xf7) {
        if (c2 >= 0x80) && (c2 <= 0xbf) {
            if (c3 >= 0x80) && (c3 <= 0xbf) {
                if (c4 >= 0x80) && (c4 <= 0xbf) {
                    i1 = (c1 - 0xf0) << 2
                    i2 = (c2 - 0x80)
                    i2a = i2 >> 4
                    i2b = i2 << 12
                    i3 = (c3 - 0x80) << 6
                    i4 = c4 - 0x80
                    poke out, cnt, i1 + i2a
                    wpoke out, cnt + 1, i2b + i3 + i4
                    i += 4
                    continue cnt + 3
                }
            }
        }
    }
    poke out, cnt, c1
    i++
loop
return
#global

#include "llmod.as"
#include "unicode.as"

s = "文字コード変換テスト"
mes "Shift-JIS : " + s + "\n"

// SJISからUNICODEに変換
u = ""
to_uni u, s, -1
notesel u
mes "Shift-JIS -> UNICODE : " + u + "\n"

// UNICODEからUTF-8に変換
u8 = ""
uni2utf8 u8, u
mes "UNICODE - > UTF-8 : " + u8 + "\n"

// UTF-8からUNICODEに変換
u = ""
utf82uni u, u8
mes "UTF-8 -> UNICODE : " + u + "\n"

// UNICODEからSJISに変換
s = ""
from_uni s, u, -1
mes "UNICODE -> Shift-JIS : " + s + "\n"

stop