Просмотр исходного кода

+ Added a flag to tarobjectreader constructor that allows it to work as regular tobjectreader if archive signature is missing.

git-svn-id: trunk@21883 -
sergei 13 лет назад
Родитель
Сommit
083f0a7137
1 измененных файлов с 14 добавлено и 10 удалено
  1. 14 10
      compiler/owar.pas

+ 14 - 10
compiler/owar.pas

@@ -69,17 +69,19 @@ type
     CurrMemberPos,
     CurrMemberSize : longint;
     CurrMemberName : string;
+    isar: boolean;
     function  DecodeMemberName(ahdr:TArHdr):string;
     function  DecodeMemberSize(ahdr:TArHdr):longint;
     procedure ReadArchive;
   protected
     function getfilename:string;override;
   public
-    constructor create(const Aarfn:string);
+    constructor create(const Aarfn:string;allow_nonar:boolean=false);
     destructor  destroy;override;
     function  openfile(const fn:string):boolean;override;
     procedure closefile;override;
     procedure seek(len:longint);override;
+    property isarchive: boolean read isar;
   end;
 
 
@@ -315,7 +317,9 @@ implementation
 *****************************************************************************}
 
 
-    constructor tarobjectreader.create(const Aarfn:string);
+    constructor tarobjectreader.create(const Aarfn:string;allow_nonar:boolean);
+      var
+        magic:array[0..sizeof(armagic)-1] of char;
       begin
         inherited Create;
         ArSymbols:=TFPHashObjectList.Create(true);
@@ -323,7 +327,14 @@ implementation
         CurrMemberSize:=0;
         CurrMemberName:='';
         if inherited openfile(Aarfn) then
-          ReadArchive;
+          begin
+            Read(magic,sizeof(armagic));
+            isar:=(CompareByte(magic,armagic,sizeof(armagic))=0);
+            if isar then
+              ReadArchive
+            else if (not allow_nonar) then
+              Comment(V_Error,'Not a ar file, illegal magic: '+filename);
+          end;
       end;
 
 
@@ -414,7 +425,6 @@ implementation
 
     procedure tarobjectreader.ReadArchive;
       var
-        currarmagic : array[0..sizeof(armagic)-1] of char;
         currarhdr   : tarhdr;
         nrelocs,
         relocidx,
@@ -429,12 +439,6 @@ implementation
         startp      : pchar;
         relocs      : plongint;
       begin
-        Read(currarmagic,sizeof(armagic));
-        if CompareByte(currarmagic,armagic,sizeof(armagic))<>0 then
-          begin
-            Comment(V_Error,'Not a ar file, illegal magic: '+filename);
-            exit;
-          end;
         Read(currarhdr,sizeof(currarhdr));
         { Read number of relocs }
         Read(nrelocs,sizeof(nrelocs));