DEADSOFTWARE

simplified trigger loading code
[d2df-sdl.git] / src / shared / BinEditor.pas
index 251f07573646492e99edf75eb1669e3cb581dbe9..25526e14c0374b5ac3de55ff639872625d34d5a4 100644 (file)
@@ -13,7 +13,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *)
-{$MODE DELPHI}
+{$INCLUDE a_modes.inc}
 Unit BinEditor;
 
 Interface
@@ -44,7 +44,7 @@ Type
     Procedure   WriteInt(Var x: Integer);
     Procedure   WriteSingle(Var x: Single);
     Procedure   WriteBoolean(Var x: Boolean);
-    Procedure   WriteString(Var x: String; aMaxLen: Byte = 255);
+    Procedure   WriteString(const x: AnsiString; aMaxLen: Word=65535);
     Procedure   WriteMemory(Var x: Pointer; memSize: Cardinal);
     Procedure   Fill(aLen: Cardinal; aFillSym: Byte);
     Procedure   SaveToFile(Var aFile: File);
@@ -70,7 +70,7 @@ Type
     Procedure   ReadInt(Var x: Integer);
     Procedure   ReadSingle(Var x: Single);
     Procedure   ReadBoolean(Var x: Boolean);
-    Procedure   ReadString(Var x: String);
+    Procedure   ReadString(Var x: AnsiString);
     Procedure   ReadMemory(Var x: Pointer; Var memSize: Cardinal);
     Procedure   Skip(aLen: Cardinal);
     Procedure   LoadFromFile(Var aFile: File);
@@ -166,7 +166,7 @@ begin
   if (FPosition + varSize) > FSize then
     ExtendMemory(varSize);
 
-  CopyMemory(Pointer(Cardinal(FData) + FPosition),
+  CopyMemory(Pointer(NativeUInt(FData) + FPosition),
              @x, varSize);
   FPosition := FPosition + varSize;
 end;
@@ -245,26 +245,22 @@ begin
   WriteVar(y, SizeOf(Byte));
 end;
 
-Procedure TBinMemoryWriter.WriteString(Var x: String; aMaxLen: Byte = 255);
+Procedure TBinMemoryWriter.WriteString (const x: AnsiString; aMaxLen: Word=65535);
 var
-  len: Byte;
-
+  len: Word;
 begin
-  len := Min(Length(x), aMaxLen);
+  if (Length(x) > aMaxLen) then len := aMaxLen else len := Word(Length(x));
 
-  if (FPosition + SizeOf(Byte) + len) > FSize then
-    ExtendMemory(SizeOf(Byte) + len);
+  if (FPosition+SizeOf(Byte)+len) > FSize then ExtendMemory(SizeOf(Byte)+len);
 
-// Äëèíà ñòðîêè:
-  CopyMemory(Pointer(Cardinal(FData) + FPosition),
-             @len, SizeOf(Byte));
-  FPosition := FPosition + SizeOf(Byte);
-// Ñòðîêà:
-  if len > 0 then
+  // Äëèíà ñòðîêè:
+  CopyMemory(Pointer(NativeUInt(FData)+FPosition), @len, SizeOf(len));
+  FPosition := FPosition+SizeOf(len);
+  // Ñòðîêà:
+  if (len > 0) then
   begin
-    CopyMemory(Pointer(Cardinal(FData) + FPosition),
-               @x[1], len);
-    FPosition := FPosition + len;
+    CopyMemory(Pointer(NativeUInt(FData) + FPosition), @x[1], len);
+    FPosition := FPosition+len;
   end;
 end;
 
@@ -274,13 +270,13 @@ begin
     ExtendMemory(SizeOf(Cardinal) + memSize);
 
 // Äëèíà áëîêà ïàìÿòè:
-  CopyMemory(Pointer(Cardinal(FData) + FPosition),
+  CopyMemory(Pointer(NativeUInt(FData) + FPosition),
              @memSize, SizeOf(Cardinal));
   FPosition := FPosition + SizeOf(Cardinal);
 // Áëîê ïàìÿòè:
   if memSize > 0 then
   begin
-    CopyMemory(Pointer(Cardinal(FData) + FPosition),
+    CopyMemory(Pointer(NativeUInt(FData) + FPosition),
                x, memSize);
     FPosition := FPosition + memSize;
   end;
@@ -293,7 +289,7 @@ begin
 
   if aLen > 0 then
   begin
-    FillMemory(Pointer(Cardinal(FData) + FPosition),
+    FillMemory(Pointer(NativeUInt(FData) + FPosition),
                aLen, aFillSym);
     FPosition := FPosition + aLen;
   end;
@@ -354,7 +350,7 @@ begin
   if (FPosition + varSize) <= FSize then
     begin
       CopyMemory(@x,
-                 Pointer(Cardinal(FData) + FPosition),
+                 Pointer(NativeUInt(FData) + FPosition),
                  varSize);
       FPosition := FPosition + varSize;
     end
@@ -410,38 +406,39 @@ begin
     x := False;
 end;
 
-Procedure TBinMemoryReader.ReadString(Var x: String);
+Procedure TBinMemoryReader.ReadString (Var x: AnsiString);
 var
-  len: Byte;
-
+  len: Word;
 begin
-  if (FPosition + SizeOf(Byte)) <= FSize then
-    begin
+  if (FPosition+SizeOf(len)) <= FSize then
+  begin
     // Äëèíà ñòðîêè:
-      CopyMemory(@len,
-                 Pointer(Cardinal(FData) + FPosition),
-                 SizeOf(Byte));
-
-      if (FPosition + SizeOf(Byte) + len) <= FSize then
-        begin
-          FPosition := FPosition + SizeOf(Byte);
-        // Ñòðîêà:
-          SetLength(x, len);
-          if len > 0 then
-            begin
-              CopyMemory(@x[1],
-                         Pointer(Cardinal(FData) + FPosition),
-                         len);
-              FPosition := FPosition + len;
-            end
-          else
-            x := '';
-        end
+    CopyMemory(@len, Pointer(NativeUInt(FData)+FPosition), SizeOf(len));
+    if (FPosition+SizeOf(len)+len <= FSize) then
+    begin
+      FPosition := FPosition+SizeOf(len);
+      // Ñòðîêà:
+      UniqueString(x);
+      SetLength(x, len);
+      if (len > 0) then
+      begin
+        CopyMemory(@x[1], Pointer(NativeUInt(FData) + FPosition), len);
+        FPosition := FPosition+len;
+      end
       else
-        raise EBinSizeError.Create('TBinMemoryReader.ReadString: Too Long String');
+      begin
+        x := '';
+      end;
     end
+    else
+    begin
+      raise EBinSizeError.Create('TBinMemoryReader.ReadString: Too Long String');
+    end;
+  end
   else
+  begin
     raise EBinSizeError.Create('TBinMemoryReader.ReadString: End of Memory');
+  end;
 end;
 
 Procedure TBinMemoryReader.ReadMemory(Var x: Pointer; Var memSize: Cardinal);
@@ -450,7 +447,7 @@ begin
     begin
     // Äëèíà áëîêà ïàìÿòè:
       CopyMemory(@memSize,
-                 Pointer(Cardinal(FData) + FPosition),
+                 Pointer(NativeUInt(FData) + FPosition),
                  SizeOf(Cardinal));
 
       if (FPosition + SizeOf(Cardinal) + memSize) <= FSize then
@@ -461,7 +458,7 @@ begin
             begin
               GetMem(x, memSize);
               CopyMemory(x,
-                         Pointer(Cardinal(FData) + FPosition),
+                         Pointer(NativeUInt(FData) + FPosition),
                          memSize);
               FPosition := FPosition + memSize;
             end