;*************************************************************************
; ○文字列の行をソートする
; 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
戻る