Browse Source

+ started implementing TOmfObjInput.ReadObjData - we go through the expected
records and read them (without parsing them yet) and verify their checksums

git-svn-id: trunk@30965 -

nickysn 10 years ago
parent
commit
be57d4900d
1 changed files with 82 additions and 0 deletions
  1. 82 0
      compiler/ogomf.pas

+ 82 - 0
compiler/ogomf.pas

@@ -120,8 +120,13 @@ interface
       { TOmfObjInput }
       { TOmfObjInput }
 
 
       TOmfObjInput = class(TObjInput)
       TOmfObjInput = class(TObjInput)
+      private
+        FRawRecord: TOmfRawRecord;
+      public
         constructor create;override;
         constructor create;override;
+        destructor destroy;override;
         class function CanReadObjData(AReader:TObjectreader):boolean;override;
         class function CanReadObjData(AReader:TObjectreader):boolean;override;
+        function ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;override;
       end;
       end;
 
 
       { TMZExeOutput }
       { TMZExeOutput }
@@ -889,6 +894,13 @@ implementation
       begin
       begin
         inherited create;
         inherited create;
         cobjdata:=TOmfObjData;
         cobjdata:=TOmfObjData;
+        FRawRecord:=TOmfRawRecord.Create;
+      end;
+
+    destructor TOmfObjInput.destroy;
+      begin
+        FRawRecord.Free;
+        inherited destroy;
       end;
       end;
 
 
     class function TOmfObjInput.CanReadObjData(AReader: TObjectreader): boolean;
     class function TOmfObjInput.CanReadObjData(AReader: TObjectreader): boolean;
@@ -905,6 +917,76 @@ implementation
         AReader.Seek(0);
         AReader.Seek(0);
       end;
       end;
 
 
+    function TOmfObjInput.ReadObjData(AReader: TObjectreader; out objdata: TObjData): boolean;
+      begin
+        FReader:=AReader;
+        InputFileName:=AReader.FileName;
+        objdata:=CObjData.Create(InputFileName);
+        result:=false;
+        FRawRecord.ReadFrom(FReader);
+        if not FRawRecord.VerifyChecksumByte then
+          begin
+            InputError('Invalid checksum in OMF record');
+            exit;
+          end;
+        if FRawRecord.RecordType<>RT_THEADR then
+          begin
+            InputError('Can''t read OMF header');
+            exit;
+          end;
+        repeat
+          FRawRecord.ReadFrom(FReader);
+          if not FRawRecord.VerifyChecksumByte then
+            begin
+              InputError('Invalid checksum in OMF record');
+              exit;
+            end;
+          case FRawRecord.RecordType of
+            RT_LNAMES:
+              begin
+                {todo}
+              end;
+            RT_SEGDEF,RT_SEGDEF32:
+              begin
+                {todo}
+              end;
+            RT_GRPDEF:
+              begin
+                {todo}
+              end;
+            RT_COMENT:
+              begin
+                {todo}
+              end;
+            RT_EXTDEF:
+              begin
+                {todo}
+              end;
+            RT_PUBDEF,RT_PUBDEF32:
+              begin
+                {todo}
+              end;
+            RT_LEDATA,RT_LEDATA32:
+              begin
+                {todo}
+              end;
+            RT_FIXUPP,RT_FIXUPP32:
+              begin
+                {todo}
+              end;
+            RT_MODEND,RT_MODEND32:
+              begin
+                {todo}
+              end;
+            else
+              begin
+                InputError('Unsupported OMF record type $'+HexStr(FRawRecord.RecordType,2));
+                exit;
+              end;
+          end;
+        until FRawRecord.RecordType in [RT_MODEND,RT_MODEND32];
+      end;
+
 {****************************************************************************
 {****************************************************************************
                                TMZExeOutput
                                TMZExeOutput
 ****************************************************************************}
 ****************************************************************************}