Печать имен импортируемых макро-файлов

Автор:Tiv
Дата:25.03.2004
Просмотров:2594
Скачиваний:693
Оценка: - , Оценок - 0
Скачать (rar-файл; Размер - 2017)

Обсудить в форуме

Описание

Печать всех имен импортируемых макрофайлов (через import). Просмотр идет в импортируемых файлах то-же. Для работы требуется findPath, и соответственно RSL >=886

Текст примера

 var FlagPrint=FALSE;
macro ReplaceString(str,ToFind,ToReplace)
  var s="",i=0;
  while(str!="")
    i=Index(str,ToFind);
    if(i>0)
      s=s+SubStr(str,1,i-1)+ToReplace;
      str=SubStr(str,i+strlen(ToFind));
    else
      s=s+str;
      str="";
    end;
  end;
  SetParm(0,s);
end;

CLASS S_Macro
  var CurPos=-1;
  var ShortName,PathName,AutoKey,Key,Child;
  var A_ShortName=Tarray,A_PathName=Tarray,A_Autokey=Tarray,A_Key=Tarray,A_Child=Tarray;
  macro Add(S_Name,Key)
    var i=A_ShortName.Size;
    if(Index(S_Name,"\\\\")>0)
      ReplaceString(S_Name,"\\\\","\\");
    end;
    while(i>0)
      i=i-1;
      if(A_ShortName[i]==S_Name)
        if(FlagPrint)
          println("Пропущена циклическая ссылка на ",S_Name);
        end;
        return FALSE;
      end;
    end;
    i=A_ShortName.Size;
    A_ShortName[i]=S_Name;
    A_PathName[i]=FindPath(S_Name);
    A_Key[i]=Key;
    A_Child[i]=0;
    if(i==0)
      A_AutoKey[i]=1;
    else
      A_AutoKey[i]=A_AutoKey[i-1]+1;
      A_Child[Key-1]=A_Child[Key-1]+1;
    end;
    return TRUE;
  end;
  macro Rewind
    CurPos=-1;
  end;
  macro print
    var i=PathName;
    if(i=="")
      i="не найден (Может это системный модуль или DLM)";
    end;
    [### ### ## Имя=###################################### Путь=#](AutoKey,Key,Child,ShortName,i);
  end;
  macro next
    var i=A_ShortName.Size;
    if((i>0) and (CurPos+1<i))
      CurPos=CurPos+1;
      ShortName=A_ShortName[CurPos];
      PathName=A_PathName[CurPos];
      AutoKey=A_AutoKey[CurPos];
      Key=A_Key[CurPos];
      Child=A_Child[CurPos];
      return TRUE;
    end;
    return FALSE;
  end;
END;

macro SplitArray(arr,str)
   array a;
   var i=0,rc,s;
   while(i<asize(arr))
     rc=Index(arr(i),str);
     if(rc==0)
       a(asize(a))=arr(i);
     else
       if(rc>1)
         a(asize(a))=SubStr(arr(i),1,rc-1);
       end;
       a(asize(a))=str;
       if((strlen(arr(i))-strlen(str)-rc)>=0)
         a(asize(a))=SubStr(arr(i),rc+strlen(str));
       end;
     end;
     i=i+1;
   end;
   asize(arr,0);
   arr=a;
   setparm(0,arr);
end;

macro FindMacro(OB)
  const Delim="\", "+StrFor(9);
  var i,FlagInImport,rc,str,FlagInComment,Flag=0;
  array CurStr;
  file ff() txt;
  while(OB.Next)
/*    MsgBox(string(OB.Autokey)+"|"+string(OB.Key)+"|"+string(OB.ShortName)+"|"+OB.PathName);*/
    Flag=Ob.Autokey;
/*    OB.Print;*/
    close(ff);
    if((OB.PathName=="") or not(open(ff,OB.PathName)))
      if(OB.PathName=="")
        MsgBox("Не найден файл "+OB.ShortName);
      else
        MsgBox("Не могу открыть файл "+OB.PathName);
      end;
    else
      SetDelim(Delim);
      FlagInComment=0;
      FlagInImport=FALSE;
      while(next(ff))
        message(Ob.ShortName," ",ff.str);
        asize(CurStr,0);
        /* ff(x) глючит - поэтому переписал */
        str=ff.str;
        while(str!="")
          i=StrBrk(str,Delim);
          if(i>0)
            if(i>1)
              CurStr(asize(CurStr))=SubStr(str,1,i-1);
            end;
            str=SubStr(str,i+1);
          else
            if(str!="")
              CurStr(asize(CurStr))=str;
            end;
            str="";
          end;
        end;
/*        while(ff(i)!="")
          MsgBox(str);
          str=strlwr(ff(i));
          if(trim(str)!="")
            CurStr(asize(CurStr))=str;
          end;
          i=i+1;
        end;*/
        if(asize(CurStr)>0)
          SplitArray(CurStr,"/*");
          SplitArray(CurStr,"*/");
          SplitArray(CurStr,";");
/*          if(menu(CurStr,ff.str)>=0)
            return;
          end;*/
          i=0;
          while(i<asize(CurStr))
            if(CurStr(i)=="/*")
              FlagInComment=FlagInComment+1;
            elif(CurStr(i)=="*/")
              FlagInComment=FlagInComment-1;
            else
              if(FlagInComment==0)
                if(CurStr(i)=="import")
                  if(FlagPrint)
                    println("Найдено начало импорта в ",OB.ShortName);
                  end;
                  FlagInImport=TRUE;
                else
                  if(FlagInImport)
                    if(CurStr(i)==";")
                      if(FlagPrint)
                        println("Найден конец импорта");
                      end;
                      FlagInImport=FALSE;
                    else
                      if(FlagPrint)
                        println("Найден:",CurStr(i));
                      end;
                      OB.Add(CurStr(i),Flag);
                    end;
                  end;
                end;
              end;
            end;
            i=i+1;
          end;
        end;
      end;
    end;
  end;
end;

macro ShowAll(OB)
  var m=tarray,i=0;
  while(i<OB.A_ShortName.Size)
    m[i]=string(OB.A_Autokey[i]:3)+""+string(OB.A_ShortName[i]:32)+""+string(OB.A_PathName[i]:40);
    i=i+1;
  end;
  menu(m);
end;

macro ShowTree(OB)
  var m=tarray,i,Key=Tarray,CurPos=Tarray,Cur=0;
  Key[Cur]=0;
  CurPos[Cur]=0;
  while(Cur>=0)
    m.Size=0;
    i=0;
    while(i<OB.A_ShortName.Size)
      if(OB.A_Key[i]==Key[Cur])
        m[m.Size]=string(OB.A_Autokey[i]:3)+""+string(OB.A_ShortName[i]:32)+""+string(OB.A_PathName[i]:40)+string(OB.A_Child[i]:2);
      end;
      i=i+1;
    end;
    if(m.Size==0)
      Cur=Cur-1;
    else
      if(Cur>0)
        i=OB.A_ShortName[Key[Cur]-1];
      else
        i="";
      end;
      i=menu(m,"Cur="+string(Cur)+" Key="+string(Key[Cur]),i,NULL,NULL,CurPos[Cur]);
      if(i<0)
        Cur=Cur-1;
      else
        CurPos[Cur]=i;
        Cur=Cur+1;
        CurPos.Size=Cur;
        Key[Cur]=int(m[i]);
      end;
    end;
  end;
end;
array m;
var OB=S_Macro,MacroName="KREDDOC.MAC",i;
m(0)="Все сразу";
m(1)="В виде каталога";
i=SelectFile(MacroName,"*.mac");
if(not(i))
  return;
end;
/*GetTrue(FlagPrint,"Печатать подробности ?");*/
OB.Add(MacroName,0);
FindMacro(OB);
OB.Rewind;
while(OB.Next)
  OB.Print;
end;
i=0;
while(i>=0)
  i=menu(m,"","Показать");
  if(i==0)
    ShowAll(OB);
  elif(i==1)
    ShowTree(OB);
  end;
end;