;*************************************************************************
;       ○文字列の行をソートする
;       sortline2 p1,p2
;               p1:文字列変数
;               p2:ソート順(0=昇順 1=降順)
;               p3:比較方法
;       改行コードで区切られた文字列をWin32APIのCompareStringで比較してソートします
;       p3には文字列の比較方法を指定します。0または以下の値を足し合わせたものです
;                       $00001  大文字と小文字を区別しません。 
;                       $10000  ひらがなとカタカナを区別しません。 
;                       $00002  場所を取らない文字(濁音など)を区別しません。 
;                       $00004  記号を無視します。 
;                       $20000  1 バイト文字と、それと同じ 2 バイト文字を区別しません。 
;                       $01000  句読点を記号として扱います。
;       改行コードはCR+LF(\n)とCR(\r)に対応していますがソート後はCR+LFに変更されます
;       変更時に変数のサイズが足りない場合statに-1がセットされます
;-------------------------------------------------------------------
#module
#deffunc init_sortline2
        dim func1,10: ll_getptr func1 : ll_ret pfunc1
        func1.0=$8bc03353,$330c244c,$ebd98bd2,$0dea8009,$8301fa80,$118a00d0,$75d20a41,$8bcb2bf0
        func1.8=$4008245c,$c35b0b89

        dim func2,22 : ll_getptr func2 : ll_ret pfunc2
        func2.0=$24448b53,$245c8b08,$244c8b10,$ebd23314,$90909016,$fa809090,$8a11750d,$0afa8011
        func2.8=$c6410175,$8900ff43,$04c08318,$8841118a,$d20a4313,$d38be075,$0c244c8b,$1024542b
        func2.16=$8b4b1189,$d33bfc50,$e8830375,$24442b04,$02e8c108,$0000c35b

        dim func3,50 : ll_getptr func3 : ll_ret pfunc3
        func3.0=$0424448b,$08244c8b,$1974c90b,$57565355,$7c8df08b,$6c8dfc88,$c033fc24,$000072e8
        func3.8=$5b5e5f00,$ff8bc35d,$df8b5756,$dbd1de03,$83fce383,$c78304ee,$eb1b8b04,$8b0e8b08
        func3.16=$890f8917,$044e8b16,$8b04c683,$ff6a2055,$51ff6a53,$08006852,$69e80000,$83000000
        func3.24=$e17202f8,$83fc4f8b,$558b04ef,$53ff6a20,$5251ff6a,$00080068,$004ae800,$f8830000
        func3.32=$3be17702,$83b672f7,$c78304ee,$8b565b04,$8dfb8bf7,$fb3b045e,$23758e77,$8b204d8b
        func3.40=$6a1f8b16,$ff6a53ff,$00685152,$e8000008,$00000014,$7602f883,$89068b06,$5f07891e
        func3.48=$76e53b5e,$e7ff56ce

        ll_libload hkernel,"kernel32.dll"
        ll_getproc pcmpstr,"CompareStringA",hkernel
        ll_poke4 pcmpstr-$5f-pfunc3,pfunc3+$5b
        ll_poke4 pcmpstr-$7e-pfunc3,pfunc3+$7A
        ll_poke4 pcmpstr-$b4-pfunc3,pfunc3+$b0

        dim func4,20 : ll_getptr func4 : ll_ret pfunc4
        func4.0=$448b5356,$5c8b0c24,$4c8b1024,$d2331424,$2474c90b,$0302e1c1,$6608ebcb,$0a0d00c7
        func4.8=$8b02c083,$04c38333,$108803eb,$46168a40,$f675d20a,$e372d93b,$18247c83,$66087400
        func4.16=$0a0d00c7,$c602c083,$5e5b0000,$000000c3

        ll_getptr tmpsize : ll_ret ptmpsize
        ll_getptr bsize : ll_ret pbsize
        return

#deffunc sortline2 val,int,int
        mref var,24
        mref flag,1
        mref cmpflag,2
        mref pval,1024
        mref _stat,64
        if flag{
                poke func3,$62,$77
                poke func3,$81,$72
                poke func3,$b7,$73
        }else{
                poke func3,$62,$72
                poke func3,$81,$77
                poke func3,$b7,$76
        }
        ll_getptr var : ll_ret pvar
        para=ptmpsize,pvar
        ll_callfunc para,2,pfunc1 : ll_ret linenum
        sdim stmp,tmpsize : ll_getptr stmp : ll_ret pstmp
        dim point,linenum : ll_getptr point : ll_ret ppoint
        para=ppoint,pbsize,pstmp,pvar
        ll_callfunc para,4,pfunc2 : ll_ret pointnum
        if pval.2*4<(bsize+linenum-1): dim stmp,1:dim point,1:_stat=-1:return
        para=ppoint,pointnum,cmpflag
        ll_callfunc para,3,pfunc3
        para=pvar,ppoint,pointnum,linenum-pointnum
        ll_callfunc para,4,pfunc4
        dim stmp,1
        dim point,1
        _stat=0
        return
#global
init_sortline2
;****************************************************




;以下使用例
cls 1
sdim s,32768
mesbox s,640,300,1 : id_mesbox=stat
button "ソート",*sort
objsize 640,22
chkbox "降順",sortopt
chkbox "大小文字を区別しない",sortopt1
chkbox "ひらがなとカタカナを区別しない",sortopt2
chkbox "場所を取らない文字(濁音など)を区別しない",sortopt3
chkbox "記号を無視する。 ",sortopt4
chkbox "1 バイト文字と、それと同じ 2 バイト文字を区別しない",sortopt5
chkbox "句読点を記号として扱う",sortopt6
stop
*sort
sortline2 s,sortopt,sortopt1+(sortopt2*$10000)+(sortopt3*2)+(sortopt4*4)+(sortopt5*$20000)+(sortopt6*$1000)
objprm id_mesbox,s
stop



戻る