;-------------------------------------- ; ; 作:せつき ; HP:http://www.setsuki.com/ ; ;-------------------------------------- ; ; gosub *no_comp (205行目) の前の「 ; 」を取り除けば、 ; 無圧縮ファイルのみ、圧縮前のファイルを作成できます。 ; ;------------------------------------- #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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #global screen 0,430,350,0,dispx-430/2,dispy-350/2-30 font "MS ゴシック",14 : objmode 2 : sdim view,1000000 sdim file,10000 : file_no=0 : h0=0 : h5=0 dialog "",16 : if stat!1 : end file=refstr begin=0 : exist file : flen=strsize if flen<0 : dialog "ファイルがありません。" : end if flen<1 : dialog "ファイルが空です。" : end sdim buf,flen : bload file,buf getpath bg,file,18 : if bg!".lzh" : dialog "LZH圧縮のファイルではありません。" : end getpath dir_first,file,17+8 view+=""+flen+" byte\n━━━━━━━━━━━━━━━\n" ;ファイルの情報を取得 ;************************************** *main ;初期変数 i=begin : sdim fname,1000 : dno=1 ;ヘッダのレベル取得 pek level,1,i+20 if level=2 { pek head,2,i : view+="全ヘッダの大きさ\t"+head } else { if level=0|(level=1){ pek head,1,i : view+="基本ヘッダの大きさ\t\t"+head pek a,1,i+1 : view+="\n基本ヘッダのチェックサム\t"+a } else { goto *finish } } view+="\n-----------------------------" pek comp,1,i+4 : pek ression,1,i+5 : sdg=-1 sdim b,100 : wpoke b,0,ression<<8+comp : view+="\n圧縮法の種類\t\t\t"+"-l"+b+"-\n\t" if b="h0"|(b="z4") { view+="無圧縮" : sdg=0 } else { if comp='h' { view+="スライディング辞書法\n\t(" if ression='1'|(ression='4') : sdg=4 if ression='2'|(ression='3')|(ression='5') : sdg=8 if ression='6'|(ression='7') : sdg=32 if ression='1' : big=60 : else : big=256 if ression='1'|(ression='2') : move=1 : else : move=0 view+=""+sdg+"Kバッファ,最大一致長"+big+"バイト)\n\t  +\n\t" if move=1 : view+="動的" : else : view+="静的" view+="ハフマン法" } if comp='z' { view+="スライディング辞書法\n\t(" if comp='z' { if ression='s' : sdg=2 if ression='5' : sdg=4 } view+=""+sdg+"kバッファ,最大一致長17バイト)" } } if sdg=-1 : goto *finish view+="\n-----------------------------" pek size,4,i+7 if level=1 { view+="\nスキップサイズ\t\t\t"+size } else { view+="\n圧縮後のファイルサイズ\t\t"+size } pek newsize,4,i+11 : view+="\n元のファイルサイズ\t\t"+newsize pek a,2,i+15 : pek c,2,i+17 if level=2 { a+=c<<16 : view+="\nファイルの最終更新日時\t\t"+a } else { view+="\nファイルの最終更新時間\t\t"+a view+="\nファイルの最終更新日\t\t"+c } pek a,1,i+19 if level=0 { view+="\nファイルの属性\t\t\t"+a } else { view+="\n予約済み(0x20 固定)\t\t"+a } view+="\nヘッダのレベル\t\t\t"+level : i+=21 if level!2 { pek a,1,i : view+="\nファイル名の長さ\t\t"+a : i++ sdim fname,100 : repeat a : pek c,1,i+cnt : wpoke fname,cnt,c : loop view+="\nファイル名\t\t\t"+fname : i+=a } pek a,2,i : view+="\nファイルの CRC-16\t\t"+a : i+=2 if level!0 { sdim b,100 : gosub *OS : view+="\n書庫を作成した OS の識別子\t"+b : i++ } if level!2 { pek a,2,i : view+="\n拡張可能部分\t\t\t"+a : i=begin+head } view+="\n-----------------------------" ;拡張ヘッダを取得する ;************************************** if level!0 { repeat pek khead,2,i : view+="\n拡張ヘッダのサイズ\t\t"+khead if khead<1|(i+khead>(begin+head)&(level=2)) : i+=2 : break pek siki,1,i+2 : ii=i+3 : c=khead-3 : check=0 if siki>=0&(siki<=63){ view+="\n● 非OS依存 " if siki=0 : view+="<共通ヘッダ>" : check=1 if siki=1 : view+="<ファイル名ヘッダ>" : check=1 if siki=2 : view+="<ディレクトリ名ヘッダ>" : check=1 if siki=63: view+="<コメントヘッダ>" : check=! } else { if(siki>=64)&(siki<=127) : view+="\n● OS依存 " if siki=64: view+="" : check=1 if siki=80: view+=" 許可属性" : check=1 if siki=81: view+=" GID/UID" : check=1 if siki=82: view+=" グループ名" : check=1 if siki=83: view+=" グループ名" : check=1 if siki=84: view+=" 最終更新日時" : check=1 } if check!1 : view+="<不明ヘッダ>" view+="\n識別子\t\t\t\t"+siki if siki=0 : pek a,2,ii : view+="\nファイルの CRC-16\t\t"+a : c-=2 : ii+=2 if siki=1|(siki=2)|(siki=63) { sdim b,khead : sdim b2,khead : sdim dir,khead,2 : dir=dir_first : e=0 repeat c pek a,1,ii+cnt : if a<0 : break : else : poke b,cnt,a if siki=2 { if a=0xff { dir.dno=b2 : sdim b2,khead : dno++ : e=0 sdim dir2,khead,dno+2 repeat dno : dir2.cnt=dir.cnt : loop sdim dir,khead,dno+3 repeat dno : dir.cnt=dir2.cnt : loop } else { poke b2,e,a : e++ } } loop if siki=1 : view+="\nファイル名\t\t\t"+b : fname+=""+b if siki=2 : view+="\nディレクトリ名\t\t\t"+b if siki=63: view+="\nコメント\t\t\t"+b } else { view+="\nデータ部分\n" repeat c pek a,1,ii+cnt : if a<0 : break int b : b=a : str b,18 : view+=""+b+" " loop } view+="\n-----------------------------" : i+=khead loop view+="\n("+i+")" } ;ファイルを展開する ;************************************** ;無圧縮ファイルを展開 if(sdg=0){ ;gosub *no_comp h0++ } ;-lh5-ファイルを展開 if comp='h'&(ression='5'){ h5++ } ;************************************** if level=2 : begin+=head+size : else : begin+=head+size+2 view+="\n━━━━━━━━━━━━━━━\n" file_no++ if begin+3-1) : goto *main ;情報を表示する ;************************************** *finish sdim b,256 : getpath b,file,16+8 : title b+" ("+file_no+"個)" view+="無圧縮\t\t("+h0+"個)\n-lh5-\t\t("+h5+"個)\n全部\t\t("+file_no+"個)" mesbox view,winx,winy,9,65535 : stop ;OSを判断 ;************************************** *OS pek o,1,i if o='M' : b="MS-DOS" : return if o='2' : b="OS/2" : return if o='9' : b="OS9" : return if o='K' : b="OS/68K" : return if o='3' : b="OS/386" : return if o='H' : b="HUMAN" : return if o='U' : b="UNIX" : return if o='C' : b="CP/M" : return if o='F' : b="FLEX" : return if o='m' : b="Mac" : return if o='R' : b="Runser" : return poke b,0,o return ;無圧縮ファイルを展開する ;************************************** *no_comp gosub *make_dir : sdim new,newsize repeat newsize pek a,1,i : i++ : poke new,cnt,a loop bsave fname,new,newsize return ;ディレクトリを作成 ;************************************** *make_dir if dir!"" { sdim d,1000 repeat dno ;カレントポジションを変更 chdir exedir+d ;ディレクトリ作成 dirlist b,"*.*",5 : strlen dsize,b sdim dlist,dsize+5 : dlist ="\n"+b instr dsize,dlist,"\n"+dir.cnt+"\n",0 if dsize=-1 : mkdir dir.cnt d+="\\"+dir.cnt loop chdir exedir+d } return