;hspmlb64.as 00/04/01-00/04/06 #define JIS_SJIS "B:\\TC\\J2S.COM " #define MAX_BUF 1301000 #define LEN_OBUF 32000 #define MAX_ARG 520 #define MAX_PATH 260 #define TITL "HSP ML base64 decoder" #define SRCH_NEXT "------=_NextPart_" SRCH_STR="=?ISO-2022-JP?B?" strlen lenSrchStr,SRCH_STR sdim arg,MAX_ARG+1 sdim buf,MAX_BUF+1 sdim bbuf,LEN_OBUF+1 sdim outbuf,LEN_OBUF+1 sdim outname,MAX_PATH+1 sdim path,MAX_PATH+1 sdim b64,66 b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" sdim s,MAX_PATH+1 screen 0,100,200,,dispx+1: ginfo 5: rate=(prmy-200)*20/5 if paluse: palette 245,191,191,191: palfade dup minline,param.0: dup minblk,param.1 inifile="hspmlb64.ini" exist inifile if strsize<0 { minline=6: minblk=3 } else { bload inifile,param } ;引数 arg=cmdline if arg=="" { chdir exedir: dialog "mbox",16,"HSP MLログ" if stat==0: dialog "キャンセルまたはエラー": end arg=refstr } strlen l,arg: if l>MAX_PATH: dialog "引数が異常です。\n引数="+arg: end ;読み込み exist arg: lenbuf=strsize if lenbuf<1: dialog arg+"が見つからないか空です": end if lenbuf>MAX_BUF: dialog "MAX_BUFが足りません。必要サイズ="+lenbuf: end bload arg,buf ;ファイル名→lfn dirlist s,arg: strlen l,s: strmid s,s,0,l-2 gosub *l_divide ;フォルダパス→path arg=path+"\\"+s ;設定ウィンドウ wid=432*rate+60/120: heit=332*rate+60/120 screen 0,wid,heit,,dispx-wid/2,dispy-heit/2: gsel 0,1 color 191,191,191: boxf: color 0,0,0 fontheit=16*rate+60/120: font "MS ゴシック",fontheit x=16: y=4: gosub *l_pos: mes "広告の最低行数(5か6くらい)" x=48: y=24: gosub *l_pos: input minline,24*rate+60/120,25*rate+60/120,1 x=16: y=56: gosub *l_pos: mes "広告の最初のブロックが1行のときの最低ブロック数 x=48: y=76: gosub *l_pos: mes "(空行と空行の間を1ブロックとする。2か3くらい)" x=48: y=96: gosub *l_pos: input minblk,24*rate+60/120,25*rate+60/120,1 x=176: y=128: gosub *l_pos: mes "本文が削除されるもの" x=48: y=148: gosub *l_pos: mes "_00500.mbox 5,2 No1〜54" x=48: y=168: gosub *l_pos: mes "_01000.mbox 4,2 なし" x=48: y=188: gosub *l_pos: mes "_01500.mbox 5,2 No1466" x=48: y=208: gosub *l_pos: mes "_02000.mbox 5,2 なし" x=48: y=228: gosub *l_pos: mes "_02500.mbox 5,2 なし" x=48: y=248: gosub *l_pos: mes "_03000.mbox 5,2 なし" x=48: y=268: gosub *l_pos: mes "_03500.mbox 6,3 なし" objsize 128*rate+60/120,28*rate+60/120: yy=296 x=48: y=yy: gosub *l_pos: button "OK",*l_go x=240: y=yy: gosub *l_pos: button "キャンセル",*l_cancel stop *l_pos x=x*rate+60/120 y=y*rate+60/120 pos x,y return *l_cancel end *l_go bsave inifile,param,8 wid=320*rate+60/120: heit=60*rate+60/120 screen 0,wid,heit,,dispx-wid/2,dispy-heit/2 title TITL if paluse: palette 245,191,191,191: palfade color 191,191,191: boxf ;とりあえず出力ファイルを作る(上書きのため) gosub *l_extention ;最後のピリオドの位置→r strmid outname,arg,0,r delname=outname+"Del.txt" bsave delname,outbuf,1 outname+=".mbo" bsave outname,outbuf,1 ;メイン bp=0 ;buf pointer fp=0 ;file pointer graphx=0 boxw=300*rate+60/120: ux=10*rate+60/120: uy=50*rate+60/120 color 0,0,255: line ux,ux,boxw+ux,ux: line ux,uy: line boxw+ux,uy: line boxw+ux,ux gosub *l_srchb64 gosub *l_srchcm gosub *l_srchhtml repeat wait 1 x=bp*boxw/lenbuf: if x-graphx>ux: boxf graphx+ux,ux,x+ux,uy: graphx=x if b64p=lenbuf { break } else { dialog "matching error": end } } } } if bp>=lenbuf: break loop if bpLEN_OBUF: gosub *l_obufErr: end gosub *l_saveOther } ;exec "command.com /c "+JIS_SJIS+outname,2 end *l_obufErr dialog "LEN_OBUFが足りません。必要サイズ="+l return ;------------------------------------------------------------------------------ ;次の広告位置を求める ;------------------------------------------------------------------------------ *l_srchcm if bp>=lenbuf: return p=bp *l_srchcm1 repeat await 0 instr m,buf,"From ",p: if m<0: break if p+m<1 { break } else { peek c,buf,p+m-1: if c==10 { break } } p+=5 loop if m<0: cmp=lenbuf: return cmp=p+m+5: instr m,buf,"\n\n",cmp: if m<0: cmp=lenbuf: return if m<400: p=cmp: goto *l_srchcm1 cmp+=m+4 peek c,buf,cmp: if c==13: p=cmp: goto *l_srchcm1 return ;------------------------------------------------------------------------------ ;広告の削除 ;------------------------------------------------------------------------------ *l_delcm l=cmp-bp: gosub *l_saveOther: if bp>=lenbuf: return c=0 ;通算行数 d=0 ;通算ブロック数 e=0 ;ブロック内行数 f=0 ;前の行が空行でないフラグ g=0 ;最初のブロックが1行のとき1 repeat await 0 instr p,buf,"\n",cmp: if p<0: l=lenbuf-bp: gosub *l_saveOther: break cmp+=p+2: c++ if p>0 { f=1: e++ } else { ;p=0のとき、つまり空行のとき if f: d++: f=0 ;前が空行でないとき if (d==1)&(e==1): g=1 ;最初のブロックが1行のとき if c>=minline { ;通算行数 ;minblkブロック以上または最初のブロックが1行でない if (d>=minblk)|(g<1): break } e=0 } loop if bp>=lenbuf: return l=cmp-bp: if l>LEN_OBUF: gosub l_obufErr: end strmid outbuf,buf,bp,l bsave delname,outbuf,l,dfp: dfp+=l bp=cmp return ;------------------------------------------------------------------------------ ;次の処理位置まで保存 ;------------------------------------------------------------------------------ *l_saveOther if l>0 { if l>LEN_OBUF: gosub *l_obufErr: end strmid outbuf,buf,bp,l: bsave outname,outbuf,l,fp: fp+=l bp+=l } return ;------------------------------------------------------------------------------ ;次のhtml位置を求める ;------------------------------------------------------------------------------ *l_srchhtml if bp>=lenbuf: return instr l,buf,"=lenbuf: return instr l,buf,SRCH_NEXT,bp+100 if l<0 { instr l,buf,"",bp if l<0 { bp+=143: return } else { htmlp=bp+l+7 } } else { htmlp=bp+100+l: instr l,buf,"\n",htmlp if l<0 { htmlp+=17 } else { htmlp+=l+2 } } l=htmlp-bp if l>LEN_OBUF: gosub *l_obufErr: end strmid outbuf,buf,bp,l: bsave delname,outbuf,l,dfp: dfp+=l bp=htmlp return ;------------------------------------------------------------------------------ ;次のbase64デコード位置を求める ;------------------------------------------------------------------------------ *l_srchb64 if bp>=lenbuf: return instr l,buf,SRCH_STR,bp: if l<0: l=lenbuf-bp b64p=bp+l return ;------------------------------------------------------------------------------ ;base64のデコード ;------------------------------------------------------------------------------ *l_base64 l=b64p-bp: gosub *l_saveOther: if bp>=lenbuf: return vp=bp+lenSrchStr instr blen,buf,"?=",vp if blen<0: gosub *l_out: return ;↓base64 decode p=0 ;bbufのポインタ erflg=0 if blen>0 { repeat blen c=d: m=cnt\4 strmid s,buf,vp,1 instr d,b64,s: if d<0: erflg=1: gosub *l_out: break if (m>0)&(d<64) { e=m*2 c=c<>(6-e)) if p>LEN_OBUF: l=p: gosub *l_obufErr: end poke bbuf,p,c: p++ } vp++ loop } if erflg: return poke bbuf,p,0 ;↑base64 decode strlen l,bbuf if l>0: bsave outname,bbuf,l,fp: fp+=l bp=vp+2 return *l_out peek c,buf,bp: poke outbuf,0,c: bsave outname,outbuf,1,fp fp++: bp++ return ;------------------------------------------------------------------------------ ;argから拡張子を取り出す ;入力:arg,MAX_PATH ;出力:t(拡張子──なければ""),r(「.」の位置──なければargの長さ) ;破壊:p,q ;------------------------------------------------------------------------------ *l_extention p=0: r=-1 repeat instr q,arg,".",p: if q<0: break r=p+q: p=r+1 loop if r<0 { strlen r,arg: t="" } else { strmid t,arg,r+1,MAX_PATH } return ;------------------------------------------------------------------------------ ;フルパスargから上位フォルダパスを求める ;入力:arg,TITL(プログラムタイトル) ;出力:path,p(最後の「\」の位置) ;破壊:c,l,p ;------------------------------------------------------------------------------ *l_divide ;最後の「\」の位置を求める strlen l,arg: if l<1: dialog "ファイル名が\"\"です",1,TITL: end p=-1 repeat l peek c,arg,cnt if c=='\': p=cnt if (c>$7F)&(c<$A0)|(c>$DF): continue cnt+2 loop if p<0: dialog "ファイル名に「\\」が見つかりません\nファイル名="+arg,1,TITL: end ;上位フォルダパスを取り出す strmid path,arg,0,p return