(発言者削除)No.02328
ENCODINGSHIFTJIS さん 01/06/28 19:06
 


[ ]
RE:02328 (発言者削除)No.02329
ENCODINGSHIFTJIS さん 01/06/28 19:09
 
// reSyncro.mac   比較点の再同期
//  前後にずらし、最初に11連一致のあった位置に移動する
//  複数行は処理できない、1行内のずらしのみ。
//  やはりアルゴリズム通りにやらないとダメかも。遅い5秒かかる
// 編集面は文字単位の操作で、マクロの文字列はバイト単位、
//  の違いはやりにくい。  
// 2画面操作
///if(-1==findhidemaru("w.txt")){menu "W.txt";endmacro;}
///#hwndw=hidemaruhandle(findhidemaru("w.txt"));
#hwnd0=hidemaruhandle(0);
#hwnd1=hidemaruhandle(1);
// 2文字列取り出し
                       #x0=x;#y0=y;// 戻り位置
right 99;$str0=gettext(#x0  ,#y0,x,y);
setactivehidemaru #hwnd1;
                       #x1=x;#y1=y;// 戻り位置
right 99;$str1=gettext(#x1  ,#y1,x,y);
//  比較バイト数  文字単位の操作は編集面のみ可能
#strlen0=strlen($str0);
#strlen1=strlen($str1);
if(#strlen0 > #strlen1)#cmplen=#strlen1;#cmplen=#strlen0;
//  比較二重ループ
///setactivehidemaru(#hwndw);selectall;delete;
///insert $str0+"\x0D\x0A";
///insert $str1+"\x0D\x0A";
#cmplen2=#cmplen;#b=0;while(#cmplen2>0){
#r5=0;
#i=0;while(#cmplen2>#i){
  if(midstr($str0,#i,3)==midstr($str1,#b+#i,3))
    {///insert "M";
     #r5=#r5+1;}else{ ///     insert ".";
     }
  if(11<=#r5){ #b01=1;goto movephase;}
  #i=#i+1;}
///insertreturn;
#r5=0;
#i=0;while(#cmplen2>#i){
  if(midstr($str0,#b+#i,3)==midstr($str1,#i,3))
    {//insert "M";
    #r5=#r5+1;}else{ ///insert ".";
    }
    if(11<=#r5){ #b01=0;goto movephase;}
  #i=#i+1;}
///insertreturn;
#cmplen2=#cmplen2-1;#b=#b+1;}

movephase:
#i=#i-10;
///menu str(#b01),str(#b),str(#i);
if(0==#b01){
///menu "0";
setactivehidemaru #hwnd0;moveto #x0+#b+#i,#y0;
setactivehidemaru #hwnd1;moveto #x1+#i,#y1;
}else{
///menu "1";
setactivehidemaru #hwnd0;moveto #x0+#i,#y0;
setactivehidemaru #hwnd1;moveto #x1+#b+#i,#y1;
}
    //
endmacro;

[ ]
RE:02329 比較点の再同期No.02331
encodingshiftjis さん 01/07/01 17:35
 
// reSync2.mac
// 比較対画面の相違部分の表示
// スペースの多いテキストはスペースにマッチしやすいため
// 動作が不良です,LCS(最長共通部分列)のアルゴリズムを使わずに
// どこまでやれるか?
// 最初は一致点から起動する、長い不一致は処理しない
// 選択を伴わない着色ができると操作の安全性が増すのだが。

#hwnd0=hidemaruhandle(0);// 新とする
#hwnd1=hidemaruhandle(1);// 旧

compfile #hwnd1;
if(-1==result){menu "比較対象が?" ;endmacro}
if(0==result){menu "以降は同じです";endmacro}
                      // 相違の先頭を拾っておく
setactivehidemaru #hwnd1; #topx1=x;#topy1=y;
setactivehidemaru #hwnd0; #topx0=x;#topy0=y;
call trySync;                         // 相違の末尾に飛ぶつもり
if(##return)goto markdiff;
                                     // ------ 追加と削除が同時 --
          #h0count=22;
while(0 < #h0count){ #h0count=#h0count-1; //
setactivehidemaru #hwnd1;
escape;right 5;
setactivehidemaru #hwnd0;
escape;right 5;
call trySync;
if(##return)goto markdiff;
  }
setactivehidemaru #hwnd1; moveto #topx1,#topy1;
setactivehidemaru #hwnd0; moveto #topx0,#topy0;
menu "ギブアップ、手操作で頭出し";
endmacro

markdiff:
while(1){
left;#code=code;setactivehidemaru #hwnd1;left;
 if(#code!=code){right;setactivehidemaru #hwnd0;right;break}
                       setactivehidemaru #hwnd0;
}
#endx0=x;#endy0=y;moveto #topx0,#topy0;beginsel;moveto #endx0,#endy0;
setactivehidemaru #hwnd1;
#endx1=x;#endy1=y;moveto #topx1,#topy1;beginsel;moveto #endx1,#endy1;
setactivehidemaru #hwnd0;

// ===========================================
endmacro;

trySync:
//                  相違の先頭からそれぞれ5文字を拾う
setactivehidemaru #hwnd1;
beginsel
 right 5; $pstr1=gettext(seltopx,seltopy,selendx,selendy);
  left 5;escape;
setactivehidemaru #hwnd0;
beginsel
 right 5; $pstr0=gettext(seltopx,seltopy,selendx,selendy);
  left 5;escape;
//
setactivehidemaru #hwnd1;
beginsel;searchdown $pstr0,casesense;
  if(result){                        //#hwnd1の純削除部分
  setactivehidemaru #hwnd0;
  return true;}
//
setactivehidemaru #hwnd0;
beginsel;searchdown $pstr1,casesense;//#hwnd0の純追加部分
  if(result)return true;
//
return false;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−

[ ]