;-------------------------------------- ; ; 作:せつき ; HP:http://www.setsuki.com/ ; ;-------------------------------------- ; ; -lh0- 無圧縮 ; -lh1- スライド辞書法( 4KB, 最大一致長 60B)+動的ハフマン法 ; -lh2- スライド辞書法( 8KB, 最大一致長256B)+動的ハフマン法 ; -lh3- スライド辞書法( 8KB, 最大一致長256B)+静的ハフマン法 ; -lh4- スライド辞書法( 4KB, 最大一致長256B)+静的ハフマン法 ; -lh5- スライド辞書法( 8KB, 最大一致長256B)+静的ハフマン法 ; -lh6- スライド辞書法(32KB, 最大一致長256B)+静的ハフマン法 ; -lh7- スライド辞書法(32KB, 最大一致長256B)+静的ハフマン法 ; ; -lz4- 無圧縮 ; -lz5- スライド辞書法( 4KB, 最大一致長 17B) ; -lzs- スライド辞書法( 2KB, 最大一致長 17B) ; ; ※スライド辞書法(LZ77法) ; ;-------------------------------------- #include "llmod.as" #include "listview.as" #module ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; num バイトを読み込み (モジュール) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc pek val,int,int mref ans, 16 mref num, 1 ;読み込みバイト数 mref i, 2 mref stt, 64 ans=0 : if i+num>flen@|(i<0) : stt=-1 : ans=-1 : return repeat num : peek a,buf@,i+cnt : ans+=a<<(8*cnt) : loop stt=i+num return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; デスクトップの場所を取得 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc get_desk val mref desk, 24 mref stt, 64 sysinfo os,0 : getpath os, os, 16 instr ans, os, "win", 0 : if ans=-1 : stt=-1 : return instr ans, os, "95" , 0 if ans=-1 : instr ans, os, "98" , 0 if ans=-1 : instr ans, os, "9x" , 0 if ans=-1 { sysinfo os,1 desk = "C:\\Documents and Settings\\"+os+"\\デスクトップ" } else { desk = "C:\\windows\\デスクトップ" } stt=0 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; オブジェクトの使用可、不可 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc objgrays int mref i ,0 ;flag mref stt,64 repeat 2,2 prm=cnt,i _hspobjhandle prm : if stat : prm=stat dllproc "EnableWindow",prm,2,D_USER loop return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #global sdim off ,65535 ;圧縮ファイルのoffset sdim box ,65535 ;情報表示 sdim file,1024 ;ファイル名 sdim desk,1024 ;デスクトップ sdim get ,1024 ;一時的s get_desk desk ;デスクトップの場所を取得 ;-------------------------------------- screen 0,500,400,0,dispx-500/2,dispy-460/2 objmode 1,1 : a=winx-64 pos 0, 0 : objsize a : input file pos a, 0 : objsize 64 : button "開く",*open pos 0, 28 : objsize a : listview a,90,13 : l_id=stat : listaddcl 0,"ファイル名",400 pos a, 64 : objsize 64 : button "表示",*view pos a, 90 : objsize 64 : button "解凍",*extract objmode 0,1 pos 0,124 : mesbox box,winx,winy-124,5 : m_id=stat ;ファイルを開く/初期設定 ;************************************** *open //オブジェクトの使用不可 objgrays 0 //ダイアログを開く dialog "",16 : if stat!1 : objgrays 1 : stop file=refstr : exist file //ファイルのチェック if strsize<0 : dialog "ファイルがありません。" : objgrays 1 : stop if strsize<1 : dialog "ファイルが空です。" : objgrays 1 : stop getpath bg,file,18 if bg!".lzh" : dialog "LZH圧縮のファイルではありません。" : objgrays 1 : stop //ファイルを読み込み flen=strsize : sdim buf,flen : bload file,buf : objprm 0,file //ファイル名のみ取得 getpath bg,file,24 : title bg+" ( "+flen+"byte) 読み込み中" all="" : off="" : i=0,0 : listdel -1 ;ファイル名&オフセット取得 ;************************************** *open_loop //オフサイズを保存 notesel off : noteadd ""+i //ヘッダのレベル pek level,1,i+20 //データサイズ pek size,4,i+7 //圧縮法の種類 strmid method,buf,i+2,5 //ヘッダサイズ if level<2 : pek a,1,i : hsize=a : size+=a+2 if level=2 : pek a,2,i : hsize=24 : size+=a if level=3 : pek a,2,i+24 : hsize=28 : size+=a //ファイル名の取得 pek a,1,i+21 : dname="" if(a>0)&(level<2){ sdim fname,a+1 : strmid fname,buf,i+22,a } if level>0 { ii=i+hsize : if level<3 : c=2 : else : c=4 repeat 20 pek b,c,ii : if b=0 : break pek a,1,ii+c if a=1 { sdim fname,b-c //ファイル名 strmid fname,buf,ii+c+1,b-c-1 } if a=2 { sdim dname,b-c //ディレクトリ名 repeat b-c-1 peek a,buf,ii+c+1+cnt : if a=0xFF : a='/' poke dname,cnt,a : loop } ii+=b loop } //ファイル名を一覧に保存 listadd i.1,"("+method+") "+dname+fname, 0, i.1 //次のヘッダ開始位置を設定 i+=size : i.1++ wait 1 : if i+30)&(level<2){ getpath get,fname,8 if get != fname { strlen a,get : poke new,21,a memcpy new,get,a,22,0 } } if level>0 { ii=i+hsize : if level<3 : c=2 : else : c=4 repeat 20 pek b,c,ii : if b=0 : break pek a,1,ii+c : if a=2 { size-=b memcpy new,buf,size-(ii-i),ii-i,ii+b } ii+=b loop } //ファイル名の取得 getpath get,fname,1 bsave desk+"\\"+get+".lzh",new,size stop ;ファイルの情報を取得 ;************************************** *view_get //開始位置を取得 listget a,0,,2 : if a<0 : a=0 notesel off : noteget get,a : int get : i=get : str get box="" : notesel box //ヘッダのレベル取得 pek level,1,i+20 : noteadd "<基本ヘッダ>" //基本ヘッダ情報(レベル0,1) ;------------------------------ if level<2 { pek head,1,i : noteadd " 基本ヘッダのサイズ     "+head+" bytes" pek checksum,1,i+1 : noteadd " 基本ヘッダのチェックサム  "+checksum strmid method,buf,i+2,5 : noteadd " 圧縮法の種類        "+method pek packed,4,i+7 : noteadd " 圧縮後のデータサイズ    "+packed+" bytes" pek original,4,i+11 : noteadd " 元のファイルサイズ     "+original+" bytes" pek time,2,i+15 : noteadd " ファイルの更新時刻     "+time+" (MS-DOS 形式)" pek date,2,i+17 : noteadd " ファイルの更新日付     "+date+" (MS-DOS 形式)" pek attrib,1,i+19 : noteadd " ファイル属性        "+attrib+" (MS-DOS 形式)" : noteadd " ヘッダのレベル       "+level pek len,1,i+21 : noteadd " ファイル名の長さ      "+len+" bytes" sdim fname,len+1 : if len>0 : strmid fname,buf,i+22,len : noteadd " ファイル名         "+fname pek filecrc,2,i+22+len : noteadd " ファイルの圧縮前のCRC  "+filecrc ii=0 : i+=24+len //基本ヘッダ情報(レベル2,3) ;------------------------------ } else { pek head,2,i : noteadd " 全ヘッダのサイズ      "+head+" bytes" strmid method,buf,i+2,5 : noteadd " 圧縮法の種類        "+method pek packed,4,i+7 : noteadd " 圧縮後のデータサイズ    "+packed+" bytes" pek original,4,i+11 : noteadd " 元のファイルサイズ     "+original+" bytes" pek time,4,i+15 : noteadd " ファイルの更新時刻     "+time+" (UNIX 形式) pek attrib,1,i+19 : noteadd " ファイル属性        "+attrib+" (ダミー)" : noteadd " ヘッダのレベル       "+level pek filecrc,2,i+22 : noteadd " ファイルの圧縮前のCRC  "+filecrc ii=i+head : i+=23 } //基本ヘッダ情報(OS情報) ;------------------------------ if level>0 { peek a,buf,i : i++ poke get,0,a : poke get,1,0 : get+=" (不明)" if a='M' : get="M (MS-DOS)" if a='2' : get="2 (OS/2)" if a='9' : get="9 (OS9)" if a='K' : get="K (OS/68K)" if a='3' : get="3 (OS/386)" if a='H' : get="H (HUMAN)" if a='U' : get="U (UNIX)" if a='C' : get="C (CP/M)" if a='F' : get="F (FLEX)" if a='m' : get="m (Mac)" if a='R' : get="R (Runser)" if a='W' : get="W (WindowNT)" if a='w' : get="w (Windows95)" if a='T' : get="T (TownsOS)" if a='X' : get="X (XOSK)" if a==0 : get="0x00 (generic)" : noteadd " 書庫を作成したOS識別子  "+get } if level=3 : pek head,4,i : noteadd " 正しい全ヘッダのサイズ   "+head : i+=4 //拡張ヘッダ情報 ;------------------------------ if level>0 { if level<3 : c=2 : else : c=4 repeat 20 pek exh_size,c,i : pek exh_kind,1,i+c if exh_size<1 { noteadd "------------------------------" noteadd "<終端ヘッダ>" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" i+=c : break } if exh_kind=0x00 { pek exh_crc,2,i+c+1 noteadd "------------------------------" noteadd "<共通ヘッダ>" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " ヘッダのCRC       "+exh_crc if c+3" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " ファイル名         "+fname i+=exh_size : continue } if exh_kind=0x02 { sdim dname,exh_size-c : repeat exh_size-c-1 : peek a,buf,i+c+1+cnt if a=0xFF { a='\' } poke dname,cnt,a : loop noteadd "------------------------------" noteadd "<ディレクトリヘッダ>" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " ディレクトリ名       "+dname i+=exh_size : continue } if exh_kind=0x3F { sdim comment,exh_size-c : strmid comment,buf,i+c+1,exh_size-c-1 noteadd "------------------------------" noteadd "<コメントヘッダ>" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " コメント          "+comment i+=exh_size : continue } if exh_kind=0x40 { pek a,2,i+c+1 noteadd "------------------------------" noteadd "" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " MS−DOSファイル属性  "+a i+=exh_size : continue } if exh_kind=0x50 { pek a,2,i+c+1 noteadd "------------------------------" noteadd "" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " 許可属性          "+a i+=exh_size : continue } if exh_kind=0x51 { pek a,2,i+c+1 : pek b,2,i+c+3 noteadd "------------------------------" noteadd "" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " GID           "+a noteadd " UID           "+b i+=exh_size : continue } if exh_kind=0x52 { sdim gname,exh_size-c : strmid gname,buf,i+c+1,exh_size-c-1 noteadd "------------------------------" noteadd "" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " グループ名         "+gname i+=exh_size : continue } if exh_kind=0x53 { sdim uname,exh_size-c : strmid uname,buf,i+c+1,exh_size-c-1 noteadd "------------------------------" noteadd "" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " ユーザ名          "+uname i+=exh_size : continue } if exh_kind=0x54 { pek a,2,i+c+1 noteadd "------------------------------" noteadd "" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind noteadd " 最終更新日時        "+a+" (UNIX 形式)" i+=exh_size : continue } noteadd "------------------------------" noteadd "<不明な拡張ヘッダ>" noteadd " 拡張ヘッダのサイズ     "+exh_size+" bytes" noteadd " 拡張ヘッダの種類      "+exh_kind i+=exh_size loop } if(level=2) : i=ii return ;無圧縮ファイルを展開する ;************************************** *no_comp memcpy new,buf,original,0,i //表示させる objprm m_id,new //デスクトップに保存 //bsave desk+"\\"+fname,new,original stop ;-lh5-圧縮ファイルを展開する ;************************************** *lh5_comp goto *no_extract stop ;-lh1-圧縮ファイルを展開する ;************************************** *lh1_comp goto *no_extract stop